了解 RESTful API
2019-05-17 本文已影响11人
半掩时光
REST,即 REpresentational State Transfer,其主语是 Resource,但是被省略掉了,所以全称是:Resource Representational State Transfer。按照字面意思来理解就是:资源在网络中以某种表现形式进行状态转移,这样的直译,我相信绝大多数看了都是困惑的,用人人都能理解的话来说,就是用 URL 来定位资源,用 HTTP 来描述操作,详细展开就是:
- 看 URL 就知道要什么
- 看 HTTP method 就知道干什么
- 看 HTTP status code 就知道结果如何
REST 是一种设计风格(不是标准),是一组架构的约束条件和原则,满足这些约束条件和原则的应用程序或设计就是 RESTful。其次,REST 是面向资源的,而资源是通过 URL 进行暴露的。理解这两点对认识 REST 和 RESTful 非常重要。
那我们的 API 应该如何设计,才能满足 RESTful API 的要求呢?
HTTP 动词
对资源的具体操作类型,应该由 HTTP 动词表示,具体如下(括号里是对应的 SQL 命令):
- GET(SELECT):从服务器取出资源(一项或多项)
- POST(CREATE):在服务器新建一个资源
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)
- DELETE(DELETE):从服务器删除资源
还有两个不常用的 HTTP 动词:
- HEAD:获取资源的元数据
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的
过滤数据
如果查询出的数据很多,API 应该提供参数,将数据的过滤结果进行返回,常见的过滤参数如下:
- ?limit=10:指定返回记录的数量
- ?offset=10:指定返回记录的开始位置。
- ?page=2&per_page=100:指定第几页,以及每页的记录数。
- ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
- ?animal_type_id=1:指定筛选条件
参数的设计是允许存在冗余的。
状态码
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
错误处理
如果状态码是 4xx,就应该向用户返回出错信息。一般来说,返回的信息中将 error 作为键名,出错信息作为键值即可:
{
error: "Invalid API key"
}
返回结果
针对不同操作,服务器向用户返回的结果应该符合以下规范:
- GET /collection:返回资源对象的列表(数组)
- GET /collection/resource:返回单个资源对象
- POST /collection:返回新生成的资源对象
- PUT /collection/resource:返回完整的资源对象
- PATCH /collection/resource:返回完整的资源对象
- DELETE /collection/resource:返回一个空文档
其他
- API 的身份认证应该使用 OAuth 2.0 框架
- 服务器返回的数据格式,应该尽量使用JSON,避免使用XML
参考链接: