`

rest 请求

    博客分类:
  • rest
阅读更多
Rest模式get,put,post,delete含义与区别(转)
解释代码  收藏代码

    POST   /uri     创建 
    DELETE /uri/xxx 删除  
    PUT    /uri/xxx 更新或创建 
    GET    /uri/xxx 查看 

GET操作是安全的。所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如我用GET浏览文章,不管浏览多少次,那篇文章还在那,没有变化。当然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端逻辑造成的。

PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。
POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
 
关于GET POST 的混淆
先说相同点,只有了解了相同点之后才能理解为什么会发生混淆。两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是var_1=value_1&var_2=value_2&....get 和 post 区别如字面,一个是get(获取),一个是post(发送)。get用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以提供查询参数(query)以获得相应内容。post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理之后再存储)。get和post出现混淆是因为对提交的数据处理方法的滥用造成的,数据是无辜的。

混淆之一:
将get提交的用来查询的字段当作是存储数据存入了服务器端文件或者数据库。然后就误以为get是用来提交用于存储的数据的。

混淆之二:
编写脚本在服务器端通过处理post提交的数据并返回内容。只要有数据,就能用来进行判断,脚本怎写是程序员的事,而不在乎数据来源的形式(post、get,或者是自己预设值的常量)。这点功能上确实没问题,只是背离的其初始目的而已。

由于都是要传送数据,且数据格式相同(即使数据格式不同,只要能提取出相应数据)。使用的时候难免出现张冠李戴,将get数据用来存储、将post数据用来检索返回数据。但是二者还是有区别的(主要是根据其用途而“人为”[注3]造成的),get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,所以还是老老实实用来做检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),因此对于大的数据(一般来说需要存储的数据可能会比较大,比2048字节大)的传递有天然的优势,谁让它是 nature born post 呢。

get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,可以在地址栏随时修改数据以变更需要获取的内容,比如直接修改分页的编号就跳到另外一个分页了(当然也可能是 404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多,url的修改只要点击地址栏输入字符就可以了),除非是专门跑来编辑数据的。

花边:post和get的安全性在传输的层面上区别不大,但是采用url提交数据的get方式容易被人肉眼看到,或者出现在历史纪录里,还是可能被肉眼看到,都是一些本地的问题。

注1:我强调的是内容,至于http协议中的get和post的格式大家有兴趣就自己看看吧。
注2:get方式主要是为了获得预期内容,即uri+query相同时所得到的内容应该是相同的。而post主要是提交内容,至于是否有必要返回页面可能只是出于用户体验,比如注册时返回你的注册id,但是如果只是返回一个“您已注册成功”的相同页面(即使你post的数据不一样)也没什么好奇怪的。
注3:关于这个“人为”,不是那么贴切,get和post还是有技术层面的区别的。但是从表象上看暂且这么说吧,毕竟二者的混淆也是“人为”的。



HTTP POST GET 本质区别
原理区别

一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE URL 全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。   
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。   
1.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。   
* 注意:这里安全的含义仅仅是指是非修改信息。   
2.幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等 这个概念:   
幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。   
幂等有以下几种定义:

对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。   
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x 。 看完上述解释后,应该可以理解GET幂等的含义了。   
但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。
根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。   
上面大概说了一下HTTP规范中,GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:   
1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。   
2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。   
3.另外一个是,早期的但是Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计 。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
分享到:
评论

相关推荐

    soap_to_rest_node:将SOAP转换为REST请求的项目

    【标题】"soap_to_rest_node:将SOAP转换为REST请求的项目"是一个旨在帮助开发者将传统的SOAP(简单对象访问协议)服务转换为更现代、更易于使用的REST(表述性状态转移)API的开源项目。该项目主要使用JavaScript...

    kettle rest 接口 请求实例

    在Kettle中,我们需要保存这个令牌,以便在后续的REST请求中使用。这可以通过设置环境变量或者将其写入文件来实现。 **保存和管理Token:** 保存token的方法有很多种,可以将其写入到Kettle的变量或参数中,也可以...

    restclient-cpp:用于发出HTTPREST请求的C ++客户端

    **restclient-cpp:HTTP REST请求的C++客户端** `restclient-cpp`是一个轻量级的C++库,专为开发人员设计,用于在他们的应用程序中方便地发送HTTP REST请求。这个库允许用户通过C++代码执行各种HTTP操作,如GET、...

    c# rest http请求类库

    例如,你可以使用`RestClient`和`RestRequest`对象来定义请求的基本信息。 ```csharp var client = new RestClient("http://api.example.com"); var request = new RestRequest("/resource", Method.GET); ``` 2. ...

    geoserver rest请求相关的部分代码

    具体描述参照 https://blog.csdn.net/dahongdahong/article/details/54629407

    CCP_REST_DEMO_PHP_v2.7r.zip_Ccp rest 请求_DEMO_breathl77_php短信验证码通

    2、测试Demo应用对电话号码有限制,只能对开发者控制台中号码管理页面配置的号码发起业务请求。 3、应用和子帐号需要配套使用。不能将自建应用与测试Demo所属子帐号结合使用。 4、本rest sdk源码在sdk目录中提供,...

    android-tao-rest-data-processor:Android REST数据处理器库。 易于构建REST请求,以接收和处理REST请求,文件系统,资产中的数据(XML,JSON,CSV等)

    易于建立REST请求,接收和处理数据(XML,JSON,CSV等) 数据处理器旨在执行简单的RESTservice请求或本地文件。 请求可以同步或异步运行。 LruCache用于存储结果,而ThreadPool用于异步请求。 从Bintray下载: ...

    redux-rest-actions:使用Redux发出REST请求的中间件

    还原休息动作Redux中间件具有简单的配置,可使用最少的代码来处理REST请求。 安装: npm install --save redux-rest-actions 或者yarn add redux-rest-actions 描述React / Redux应用程序需要处理的主要功能之一是在...

    CAS配置REST请求方式所需JAR包和测试类

    cas单点登录通过rest方式获得票据:cas-server-integration-restlet-4.0.0.jar, org.restlet-3.0-M1.jar, org.restlet.ext.servlet-3.0-M1.jar , org.restlet.ext.spring-3.0-M1.jar

    rest 调用有参数接口

    在Java中,我们经常使用HTTP客户端库来发送REST请求。例如,`HttpURLConnection`是Java标准库中的一个选项,但它使用起来相对复杂。更常见的是使用第三方库,如Apache HttpClient或OkHttp。然而,提供的文件`...

    rest-graphql:Express中间件,以使REST请求适应GraphQL查询

    Express中间件,以使REST请求适应GraphQL查询 动机 您已经构建了一个GraphQL服务器,并且可以使用了。 并非所有的客户都说GraphQL。 至少,旧版移动客户端无法发出GraphQL请求。 您不想同时支持旧版合同和GraphQL...

    python实现rest请求api示例

    该代码参考新浪python api,适用于各个开源api请求 复制代码 代码如下:# -*- coding: utf-8 -*-import collectionsimport gzipimport urllibimport urllib2from urlparse import urlparse try: from cStringIO ...

    Java Client 请求Rest Service

    在Java中,客户端发送REST请求主要使用HttpURLConnection、Apache HttpClient或OkHttp等库。 1. **HttpURLConnection**:这是Java标准库中的一个类,可以用来创建HTTP连接。使用HttpURLConnection,你可以设置请求...

    gas-rest:使用 Google Apps 脚本构建 RESTful API 的 REST 请求翻译器

    使用托管的 Google Apps 脚本构建 RESTful API 的 REST 请求翻译器 为什么 5分钟搭建RESTful后端进行前端开发 概述 路线 动词 描述 /api/:script_id 得到 从 getSheets()[0] 获取所有项目 /api/:script_id 邮政 在...

    Paw 3.1.5 for Mac 破解版下载 – 优秀的HTTP服务请求开发调试工具

    Paw 3.1.5 版本,支持最新的 macOS 10.13 High Sierra 系统,Paw是一款Mac上非常好用的HTTP/REST请求开发调试工具,具有全新的界面和黑色主题,Paw可以让Web开发者设置各种请求Header和参数,模拟发送HTTP请求,测试...

    简单封装rest api(支持http,https请求及代理模式)

    现在很多主流平台采用rest方式的...于是乎简单封装下rest请求api(其实就是两个简单Java类,呵呵),可以实现http及https模式的请求,也支持JsessionId和代理模式,甚至系统自动发送邮件的功能也是用此工具类实现的.

    Rest Severs in Delphi XE Using DataSnap

    通过TRESTServer.OnExecute事件,我们可以编写处理REST请求的具体逻辑。 为了让DataSnap服务器支持REST,需要使用TRESTResponse和TRESTRequest对象。TRESTResponse用于设置响应状态和内容,而TRESTRequest则用于...

    REST框架简单实现

    部署到Tomcat等Servlet容器后,这些Servlet将能够处理来自客户端的REST请求。 总结,使用Servlet实现REST框架涉及对HTTP方法的理解、URL映射、路径参数、内容协商以及业务逻辑的处理。这种实现方式简单直观,适合...

    Struts2 Rest方式和非Rest方式共存

    1. **配置ActionMapper**:在`struts.xml`配置文件中,为REST请求指定`RestActionMapper`。这样,当遇到符合RESTful风格的URL时,Struts2会使用这个特殊的ActionMapper来处理。 2. **定义RESTful Actions**:创建...

    Struts2+rest简单实例

    6. **请求与响应处理**:在Action中,开发者需要处理来自REST请求的数据,这可能包括解析请求参数,执行业务逻辑,然后将结果以适当的形式(如JSON或XML)返回给客户端。 7. **部署**:此示例包含所有必要的文件,...

Global site tag (gtag.js) - Google Analytics