restful API设计风格

一、REST是什么

REST(英文:Representational State Transfer,简称REST,中文意思为:表述性状态转移)是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为查询,新增、变更、删除所调用资源。它描述了一个架构样式的网络系统,比如web应用程序。它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。

REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。REST提出了一组架构约束条件和原则,任何满足REST约束条件和原则的架构,都称为RESTful架构。

二、理解REST

要规范使用RESTful架构,首先要理解REST。我们可以通过理解"资源"、“表述”、“状态转移”来理解REST。

(1)资源(Resource):我们可以把真实的对象数据称为资源。一个资源既可以是一个集合,也可以是单个个体。比如我们的班级classes是代表一个集合形式的资源,而特定的class代表单个个体资源。每一种资源都有特定的URI(统一资源标识符)与之对应,如果我们需要获取这个资源,访问这个URI就可以了,比如获取特定的班级:/class/12。另外,资源也可以包含子资源,比如 /classes/classId/teachers:列出某个指定班级的所有老师的信息。
(2)表现形式(Representational):"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式比如json,xml,image,txt等等叫做它的"表现层/表现形式"。在REST中,客户端与服务器之间的通信,传输的都是资源的表述。
(3)状态转移(State Transfer) :这里的状态其实应该分为应用状态和资源状态。应用状态由客户端保存维护,例如会话状态等。客户端通过REST API返回的表述以及表述中的URI,进行客户端应用状态的转移。但REST更强调的是资源状态,REST中的状态转移更多的是描述服务器端资源的状态。资源状态存储在服务器端,客户端通过REST API,指定请求方法、资源路径和资源表述(可以包含应用状态),对资源的状态进行增删查改。也就是通过增删改查(通过HTTP动词实现)引起资源状态的改变。

PS:互联网通信协议HTTP协议,是一个无状态协议,所有的资源状态都保存在服务器端。

结合上面三点,客户端通过REST API对服务器端的资源进行增删查改,引起资源的状态转移。而这种转移是体现在表述上的,所以称为表述性状态转移。

最后总结一下什么是RESTful架构:

  • 每一个URI代表一种资源;
  • 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  • 客户端和服务器之间,传递这种资源的格式如json,xml,image,txt等等称为资源的表现形式;
  • 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息;
  • 客户端通过特定的HTTP动词,对服务器端资源进行操作,从而实现"表现层状态转移"。

三、RESTful原则

REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。Web应用程序最重要的REST原则是:客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI (Universal Resource Identifier,即统一资源标识符) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP方法,比如GET、PUT、POST和DELETE。Hypermedia(超媒体)是应用程序状态的引擎,资源表示通过超链接互联。

四、RESTful与RPC

使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端点。它忽略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样式的架构中,关注点在于资源 —— 将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。

Leonard Richardson和Sam Ruby在他们的著作RESTful Web Services中引入了术语REST-RPC混合架构。REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。

五、总结

RESTful架构是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,因此被越来越多的网站采用。
RESTful架构是对MVC架构改进后所形成的一种架构,通过使用事先定义好的接口与不同的服务联系起来。在RESTful架构中,浏览器使用POST,DELETE,PUT和GET四种请求方式分别对指定的URL资源进行增删改查操作。因此RESTful是通过URI实现对资源的管理及访问,具有扩展性强、结构清晰的特点。

RESTful架构将服务器分成前端服务器和后端服务器两部分,前端服务器为用户提供无模型的视图;后端服务器为前端服务器提供接口。浏览器向前端服务器请求视图,通过视图中包含的AJAX函数发起接口请求获取模型。
项目开发引入RESTful架构,利于团队并行开发。在RESTful架构中,将多数HTTP请求转移到前端服务器上,降低服务器的负荷,使视图获取后端模型失败也能呈现。但RESTful架构却不适用于所有的项目,当项目比较小时无需使用RESTful架构,项目变得更加复杂。

六、参考博文

(1) https://baike.baidu.com/item/RESTful/4406165?fr=aladdin (百度百科)
(2) https://www.runoob.com/w3cnote/restful-architecture.html
(3) https://www.cnblogs.com/chinajava/p/5871305.html
(4) http://www.ruanyifeng.com/blog/2011/09/restful.html
(5) https://segmentfault.com/a/1190000016313947
(6)https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/coding-way/RESTfulAPI简明教程.md

posted @ 2020-06-08 11:08  jason小蜗牛  阅读(299)  评论(0编辑  收藏  举报