前后端分离:RESTful API和HTTP动词

Posted 张富涛的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前后端分离:RESTful API和HTTP动词相关的知识,希望对你有一定的参考价值。


这是张富涛的第12篇原创

前后端分离:RESTful API和HTTP动词

1. 前言

现在很多公司都使用“前后端分离”进行开发,“后端工程师”为“前端工程师”提供API接口,这么做的好处是可以“确认职责”和“提高开发效率”,同时还有一套接口设计的比较好后,还可以让移动端调用。但前后端分离本质上是使用“增加人数、明确分工”来“提高产能”的,软件研发行业一般有一个比较基本的理念是:如无必要,勿增实体 ,但如果使用这种方案,一般必须要制定一套机制,或者说是一套约定,保证“实体”(前后端工程师)之间的沟通顺畅,让其更有条理进行前后端分离开发。

本系列讲讲我们在开发过程中进行的,可行的前后端分离探索,主要包含以下命题,大概3~4篇内容:

  • RESTful API和HTTP动词
  • Swagger
  • JWT(JSON Web Token)

2. 概述

RESTful API就是目前比较成熟的一套互联网应用程序的API设计理论,今天我们就来简单了解一下RESTful API,在下面的介绍中,我们可以假设自己即将设计一套为移动端提供的接口,来寻找解决方案,这样会更便于理解RESTful API。

3. 域名

应该尽量将API部署在专用域名之下:

https://api.example.com/

如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下:

https://example.com/api/

4. API版本

https://api.example.com/v1/

值得一提的是Github就采用这种做法。

5. Action地址设计

https://api.example.com/v1/users

而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

6. HTTP动词

在RESTful框架中,用不同的HTTP动词标识对一种资源的操作类型。

常用的HTTP动词有下面五个(括号里是对应的SQL命令):

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

还有两个不常用的HTTP动词:

  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

下面是关于设计的一些例子:

  • GET     /users:列出所有用户
  • POST  /users:新建一个用户
  • GET     /users/id:获取某个指定用户的信息
  • PUT     /users/id:更新某个指定用户的信息(提供该用户的全部信息)
  • PATCH /users/id:更新某个指定用户的信息(提供该用户的部分信息)
  • DELETE /users/id:删除某个用户
  • GET         /users/id/orders:列出某个指定用户的所有订单
  • DELETE /users/id/orders/id:删除某个指定用户的指定订单

7. 对于不同HTTP动词的返回值

  • GET(SELECT):一个对象或多个对象的集合(数组)
  • POST(CREATE):返回创建的对象信息
  • PUT(UPDATE):返回修改后的对象信息
  • PATCH(UPDATE):返回修改后的对象信息
  • DELETE(DELETE):返回空

8. 返回状态码

在RESTful设计中,接口返回的信息中需要返回状态码及提示信息,如在“连接成功要返回200”,“获取不到访问页面返回404”等状态码,常用的状态码如下(除了这些我们也可以自己设计状态码,但是需要跟前端做好约定):

(方括号中是该状态码对应的HTTP动词):

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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

9. 安全性

为了保证我们设计的接口的安全性,保证应用与API服务器之间的安全通信,防止数据篡改中间人攻击等恶意攻击,建议使用HTTPS协议,同时不建议一些隐私权限的API直接将参数进行明文传参,而改成传递token和参数加密等形式:例如:有个修改昵称的API,参数中“修改谁的昵称(uid)”不应该直接传递,而应该改为token形式,同时增加调用权限校验。

10. 完美结合RESTful的文档生成工具

在做RESTful形式开发时,最好结合文档生成工具进行开发,这样能够实时给前端更新文档的同时,也方便前端进行测试。

下面这张图为Swagger生成的接口文档和测试接口:前后端分离:RESTful API和HTTP动词

注意:经过实践结果,swagger仅是生成API文档(并可供web直接访问)的工具,对代码有一定侵入性,但侵入程度不大。

11. 一个可供参考的RESTful返回值结构

之前我在开发前后端分离时自己总结出了一个返回值的结构,在项目开发的过程中我们的开发体验较不错,在这里分享给大家(删除了get、set方法):

长按下图二维码关注:

以上是关于前后端分离:RESTful API和HTTP动词的主要内容,如果未能解决你的问题,请参考以下文章

序列化器的理解

python DRF操作流程

前后端分离与 restful api

前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!

谈谈前后端分离实践中如何提升RESTful API开发效率

Flask之RESTFul API前后端分离