RESTful API 设计指南:
⑥ 过滤信息
如果记录的数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果。
下面是一些常见的参数:
# 指定返回记录的数量
https://api.example.com/v1/zoos?limit=10
# 指定返回记录的开始位置
https://api.example.com/v1/zoos?offset=10
# 指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?page=2&per_page=100
# 指定返回结果,按照哪个属性排序,以及排序顺序
https://api.example.com/v1/zoos?sortby=name&order=asc
# 指定筛选条件
https://api.example.com/v1/zoos?animal_type_id=1
参数的设计允许存在冗余,即允许 API 路径和 URL 参数偶尔有重复。
比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
⑦ 状态码
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的 HTTP 动词)。
200 OK - [ GET ]
201 CREATED - [ POST/PUT/PATCH ]
202 Accepted - [ * ]
204 NO CONTENT - [ DELETE ]
400 INVALID REQUEST - [ POST/PUT/PATCH ]
401 Unauthorized - [*]
403 Forbidden - [*]
404 NOT FOUND - [*]
406 Not Acceptable - [GET]
410 Gone - [GET]
422 Unprocessable 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
⑩ Hypermedia API
RESTful API 最好做到 Hypermedia,即返回结果中提供链接,连向其它 API 方法,使用户不查文档,也知道下一步应该做什么。
比如,当用户向 api.example.com 的根目录发出请求,会得到这样一个文档。
{
“link”: {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}
}
上面的代码表示,文档中有一个 link 属性,用户读取这个属性就知道下一步该调用什么 API 了。rel 表示这个 API 与当前网址的关系(collection 关系,并给出该 collection 的网址),href 表示 API 的路径,title 表示 API 的标题,type 表示返回类型。