本篇文章基于 REST api 介绍HTTP请求方法、HTTP响应码和API数据载荷, 是之前介绍 REST 那篇文章的延伸

HTTP Status Codes

在之前文章中, 定义的 HTTP status code 如下:

上面全是成功的响应, 下面介绍错误响应

Client errors in the request

这里将 malformed payload 分为两类:

  1. payload with invalid syntax: 服务器无法解析或理解的数据, 例如json格式不对, 少了个反括号"}“之类的
  2. unprocessable entities: 指却少要求属性的数据. 例如json里面要求name属性, 但是payload没有传这个属性; 又比如传入了一个不存在的资源, 这时返回一个404, 表示找不到相关资源

还有一种常见错误是, 发送了一个不支持的 HTTP 请求, 有两种 status code:

关于 身份验证(authentication) 和 授权(authorization) 相关的请求错误有以下两个:

Server errors in the report

第2种错误是由于服务器代码 bug 或者基础设施限制导致的, 这时返回一个 500 (Internal Server Error)

另一种相关的错误是, 程序无法处理请求的问题, 通常使用 proxy server 或者 API gateway 来解决这个问题. 由于服务器过载或者下线维护的时候, 我们需要将当前情况告知用户.

Designing API Payloads

这部分介绍设计用户友好的 HTTP request / response payloads 的最佳实践.
payloads 是指 client 和 server 之间传输的数据部分. API 的可用性往往依赖好的 payload 设计, 糟糕的设计会使得 API 的用户使用体验变差.

一个 HTTP request 包含了 URL, HTTP method 和 一系列的 headers 以及一个可选的 body(payload). HTTP headers 包含了请求的元数据, 例如 encoding format.
类似的, HTTP response 包含一个 status code, 一协力的 headers 以及一个可选的 payload.
可以使用不同的序列化方法来表示 payloads, 例如 XML 和 JSON. 在 REST APIs, 数据通常使用 JSON document.

HTTP 请求规范在 DELETE 和 GET 请求是否可以包含 payload 这一点上故意保持模糊, 其并未禁止使用 payload. 这使得一些 API 可以在 GET 请求中包含负载, 一个著名的例子是 Elasticsearch, 它允许客户端在 GET 请求的请求体中发送查询文档.

对于 HTTP Response 而言, 根据 status code 的不同, 可能会包含 payload. 根据 HTTP 规范(specification), 1xx, 204(No Content) 和 304(Not Modified) 这些状态码不能包含payload, 而其他的 response 都有.
在 REST APIs 中, 最重要的就是 4xx 和 5xx 的错误响应, 以及 2xx 的成功响应和204的异常.

HTTP payload designing patterns

错误的响应应该包含"error"关键字, 以及具体的细节信息, 并解释错误原因.
例如, 一个 404 Response 返回的信息应该包含下面这些

JSON
{
    "error": "Resource not found"
}
Click to expand and view more

error 是比较常用的关键字, 当然你也可以使用 “detail” 和 “message” 这类关键字. 大多数的 Web 框架都有默认的错误模板, 例如 FastAPI 使用"detail”.

对于成功响应的 HTTP Response 而言, 区分为3种类型: 创建资源, 更新资源 和 获取资源.

Designing URL query parameters

一些 API 接口会返回一个资源列表, 当一个接口返回资源列表时, 最佳实践是允许用户对结果进行筛选分页. 例如 GET /orders 接口, 可能希望结果为最近的5个订单, 或者只列出已取消的订单. URL 查询参数能让我们实现这些目标, 他应当始终是可选的, 并且在适当的情况下, 服务器可以为其分配默认值.

定义: URL 查询参数是 URL 中的键值对参数. 查询参数位于问号(?)自后, 通常用于筛选接口的返回结果. 可以用与号(&)来分隔组合多个查询参数.

调用 GET /orders 接口并按"已取消"来筛选订单结果, 可以这样写

PLAINTEXT
GET /orders?cancelled=true
Click to expand and view more

链接多个参数

向 GET /orders 端点添加一个名为 limit 的查询参数以限制返回结果的数量. 如果要筛选"已取消"订单并将返回结果限制为 5 条, 可以这样请求 API

PLAINTEXT
GET /orders?cancelled=true&limit=5
Click to expand and view more

分页

允许 API 客户端对结果进行分页也是一种常见的做法. 分页(Pagination)是指将结果切分成不同的集和, 并一次提供一个集和. 可以使用多种策略进行分页, 最常见的方法是使用 page 和 per_page 则两个参数的组合. page 代表数据的某个集和(页码), 而 per_page 则告诉每个集和中想要包含多少个项目. 服务器根据 per_page 的指来确定每一页返回多少条数据.
在 API 中组合这两个参数, 如下所示:

PLAINTEXT
GET /orders?page=1&per_page=10
Click to expand and view more

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut