RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
RESTful特点
1、每一个URL代表一种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
RESTful与RPC
使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA(面向服务的架构)最常用的方法。RPC样式的Web客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URL的RPC样式Web服务,URL表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。
由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java程序、Perl、Ruby、Python、PHP和Javascript【包括Ajax】)实现客户端。RESTful Web服务通常可以通过自动客户端或代表用户的的应用程序访问。但是,这种服务的简便性让用户能够与之交互,使用它们的Web浏览器构建一个GET URL并读取返回的内容。
在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTP GET、POST、PUT、DELETE,还可能包括HEAD和OPTIONS。
在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源——将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。
RESTful架构
RESTful架构是对MVC架构改进后形成的一种架构,通过使用事先定义好的接口与不同的服务联系起来。在RESTful架构中,浏览器使用POST、DELETE、PUT和GET四种请求方式分别对指定的URL资源进行 增删改查操作。因此,RESTful是通过URL实现对资源的管理及访问,具有扩展性强,结构清晰的特点。
RESTful架构将服务器分为前端服务器和后端服务器两部分,前端服务器为用户提供无模型的视图;后端服务器为前端服务器提供接口。浏览器向前端服务器请求视图,通过视图中包含的AJAX函数发起接口请求获取模型。
项目开发引入RESTful架构,利于团队并行开发。在RESTful架构中,将多数HTTP请求转移到前端服务器上,降低服务器的负荷,使视图获取后端模型失败也能呈现。但RESTful架构却不适用于所有的项目,当项目比较小时无需使用RESTful架构,项目变得更加复杂。
怎么理解幂等性
HTTP幂等方法,是指无论调用多少次都不会有不同结果的HTTP方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。
GET /tickets # 获取ticket列表
GET /tickets/12 # 查看某个具体的ticket
POST /tickets # 新建一个ticket
PUT /tickets/12 # 更新ticket 12
PATCH /tickets/12 # 更新ticket 12
DELETE /tickets/12 # 删除ticekt 12
HTTP GET方法
HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。
GET /tickets # 获取ticket列表
GET /tickets/12 # 查看某个具体的ticket
只是查询数据,不会影响到资源的变化,因此我们认为它幂等。
幂等性指的是作用于结果而非资源本身。例如,这个HTTP GET方法可能会每次得到不同的返回内容,但并不影响资源。
有这种情况吗?当然有。例如,我们有一个接口获取当前时间,我们就应该设计成
GET /service_time # 获取服务器当前时间
它本身不会对资源本身产生影响,因此满足幂等性。
HTTP POST方法
HTTP POST方法是一个非幂等方法,因为调用多次,都将产生新的资源。
POST /tickets # 新建一个ticket
因为它会对资源本身产生影响,每次调用都会有新的资源产生,因此不满足幂等性。
HTTP PUT方法
HTTP PUT 方法是不是幂等的呢?如下
PUT /tickets/12 # 更新ticket 12
因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的HTTP方法,所以满足幂等性。
HTTP PATCH方法
HTTP PATCH方法是非幂等的。HTTP PATCH方法只是更新部分资源,怎么是非幂等的呢?
因为,PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的资源。换句话说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是非幂等的了。
举个例子
PATCH /tickets/12 # 更新ticket 12
此时,我们服务端对方法的处理是,当调用一次方法,更新部分字段,将这条ticket记录的操作记录加一,这样,每次调用的资源是不是变了,所以它是有可能是非幂等的操作。
HTTP DELETE方法
HTTP DELETE方法用于删除资源,会将资源删除。
DELETE /tickets/12 # 删除ticekt 12
调用一次和多次对资源产生影响是相同的,所以也满足幂等性。
如何设计符合幂等性的高质量的RESTful API
HTTP GET方法 vs HTTP POST方法
HTTP请求的GET和POST方法有什么区别?你可能会回答:GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。但是,我们从RESTful的资源角度来看待问题,HTTP GET方法是幂等的,所以它适合作为查询操作,HTTP POST方法是非幂等的,所以用来表示新增操作。
但是,也有例外,我们有的时候可能需要把查询方法改造成HTTP POST方法。比如,超长(1k)的GET URL使用POST方法来替代,因为GET受到URL长度的限制。虽然,它不符合幂等性,但是它是一种折中的方案。
HTTP POST方法 vs HTTP PUT方法
对于HTTP POST方法和HTTP PUT方法,我们一般的理解是POST表示创建资源 ,PUT表示更新资源。当然,这是正确的理解。但是,实际上,两个方法都用于创建资源,更为本质的差别是在幂等性。HTTP POST方法是非幂等,所以用来表示创建资源。HTTP PUT方法是幂等的,因此表示更新资源更加贴切。
HTTP PUT方法 vs HTTP PATCH方法
HTTP PUT方法和HTTP PATCH方法,都是用来表述更新资源,它们之间有什么区别呢?我们一般的理解是PUT表示更新全部资源,PATCH表示更新部分资源。首先,这个是我们遵守的第一准则。根据上面的描述,PATCH方法是非幂等的,因此,我们在设计我们服务端的RESTful API的时候,也需要考虑。如果,我们想要明确的告诉调用者我们的资源是幂等的,我的设计更倾向于使用HTTP PUT方法。
- 版权声明:本文引用了由 梁桂钊 发表于 梁桂钊的博客
- 文章标题:如何理解RESTful的幂等性 | 梁桂钊的博客
- 文章链接:http://blog.720ui.com/2016/restful_idempotent/