1. 什么是REST
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。
REST指的是一组架构约束条件和原则。" 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
RESTful是一种软件架构风格、设计风格,不是标准,它只是提供了一组设计原则和约束条件。
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。
2. 理解RESTful
资源与URI
REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务...
每种资源对应一个特定的标识。在Web中这个唯一标识就是URI(Uniform Resource Identifier)。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
URI既可以看成是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源, 只能算是资源的一些信息而已。URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。
URI设计参考:
- 使用_或-来间隔单词,提高URI可读性;
- URI中可以带版本号,区别版本
- 使用/体现资源的层级关系;
- 使用,;表示同级资源关系,也可以使用...;
- 使用?过滤资源
- 可以通过URI后缀来区分数据格式
- URI中避免使用动词
URL:同一资源定位符,偏重定位,说明了通过那种协议来访问一个资源。
URI:同一资源标识符,偏重标识,一个字符串格式规范。
URL是URI的子集。
schema://host[:port]/path [?query-string][#anchor]
- schema:指定底层使用的协议(例如:http,https,ftp)
- host:服务器的IP地址或者域名
- port:服务器端口,默认为80
- path:访问资源的路径
- query-string:发送给http服务器的数据
- anchor:锚
状态转化(State Transfer)
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层("资源"具体呈现出来的形式,叫做它的"表现层"(Representation))之上的,所以就是"表现层状态转化"。
统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。
幂等性:每次HTTP请求相同的参数,相同的URI,产生的结果是相同的
对资源的CRUD(create, read, update和delete,即数据的增删查改)操作,分别使用HTTP对应的方法,:
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
- HEAD:获取资源的元数据。
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
遵守http响应状态码规范:
- 1xx:信息响应类,表示接收到请求并且继续处理
- 2xx:处理成功响应类,表示动作被成功接收、理解和接受
- 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
- 4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
- 5xx:服务器端错误,服务器不能正确执行一个正确的请求
常用状态码
- 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
- 204 NO CONTENT - [DELETE]:用户删除数据成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
- 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
结语
现在,RRSTful基本已经取代了复杂难懂而且笨重的SOAP了,成为Web API的设计标准
本文参考文档
- http://www.ruanyifeng.com/blog/2011/09/restful.html
- http://www.ruanyifeng.com/blog/2014/05/restful_api.html
- https://www.jianshu.com/p/21622d81ab26
- https://baijiahao.baidu.com/s?id=1634470186508003064&wfr=spider&for=pc
- https://www.runoob.com/w3cnote/restful-architecture.html
- https://baike.baidu.com/item/RESTful/4406165?fr=aladdin