REST既不是标准,也不是协议,而是一组架构约束条件和设计指导原则,一种基于HTTP、URI、XML 等现有协议与标准的开发方式。REST是Representational State Transfer的缩写,直译为“表现层状态转移”。一个最简单的实现条件,就是用url来定位资源,用HTTP请求的类型(get/put/patch/delete/post)来描述操作。
举个例子:
常用的资源操作类型,即http请求方式(括号中是对应的SQL命令)
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
传统风格的API可能会这样设计
url: api/getProductList type: post/get
url: api/setProductList type: post/get
url: api/updateProductList type: post/get
符合RESTful风格的API则会如下:
url: api/productList type: get 获取产品列表
url: api/productList type: post 新建产品列表
url: api/productList/id type: get 获取某个产品信息
url: api/productList/id type: put 更新某个产品信息
url: api/productList/id type: patch 更新某个产品的部分信息
url: api/productList/id type: delete 删除某个产品
统一接口是REST区别于其他架构风格的核心特征,简单总结就是:URL中的路径(endpoint)不能有动词,只能用名词。用HTTP方法对资源进行增删改查的操作。
另外,RESTful约束服务端应向用户返回规范的状态码和提示信息。
常见的如:
- 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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
除了上述两点之外,RESTful的约束条件还有无状态、可缓存、分层系统等,能有效提高接口可移植性、前后端开发分离、降低架构层级之间的耦合性、提升开发人员工作效率和系统运行效率。