restful最佳实践
使用名词,而不是动词
推荐
资源 | GET/read | POST/create | PUT/update | DELETE |
---|---|---|---|---|
/cars | 获取所有车辆信息 | 新建一辆车 | 批量更新车 | 删除所有车 |
/cars/711 | 获取某一指定车辆 | 不允许(405) | 更新某一指定车辆 | 删除某一特定车辆 |
不推荐
1 | /getAllCars |
不应该使用GET和查询参数改变状态
推荐
1 | 使用POST、PUT、DELETE替代GET |
不推荐
1 | GET /users/711?active |
使用名词的复数形式
不要混合使用名词的单数和复数。仅仅使用名词的复数形式代表所有资源
推荐
1 | /cars |
不推荐
1 | /car |
使用子资源进行关联
如果资源与另一资源相关,使用子资源
1 | //获取开711车的所有驾驶员信息 |
使用HTTP请求/响应头序列化格式
用于规定服务端与客户端双方的通信格式
1 | Content-Type 定义请求格式 |
使用HETEOAS
Hypermedia as the Engine of Application State
在API中使用超链接创建更好的导航
1 | { |
为集合提供筛选,排序,字段选择和分页
- 筛选
1 | GET /cars?color=red //获取颜色为红色的车辆列表 |
- 排序
1 | GET /cars?sort=-manufactorer,+model //获取根据制造商降序、型号升序排序的车辆列表 |
字段选择
客户端不需要展示一个资源的所有属性,让客户端可以自己选择返回的字段,减少网络流量,提高速度
1 | GET /cars?fields=manufacturer,model,id,color |
- 分页
使用limit和offset,默认值limit=20,offset=0
1 | GET /cars?offset=10&limit=5 |
总条数使用HTTP头:X-Total-Count
1 | X-Total-Count: 100 |
上一页下一页链接使用HTTP头:Link,而不是自己构建链接
1 | Link: <http://127.0.0.1/api/v1/cars?offset=15&limit=5>; rel="next", |
版本化API
将API版本设为必选,不发布未版本控制的API。使用简单的序数,并在前面加上v,避免使用点表示法(2.5)
1 | /api/v1 |
使用HTTP状态玛表示错误
码表,使用一些常用的状态码,而非全部
状态码 | 描述 | 解释 |
---|---|---|
200 | OK | 一切正常 |
201 | OK | 创建新资源 |
204 | OK | 资源被成功删除 |
304 | Not Modified | 客户端可以使用缓存数据 |
400 | Bad Request | 无效请求,确切的错误在错误返回中说明。如,“JSON是无效” |
401 | Unauthorized | 要求用户验证 |
403 | Forbidden | 服务端识别该请求,但拒绝或无权访问 |
404 | Not found | 无对应的URI |
422 | Unprocessable Entity | 服务器无法处理实体,例如,图像无法格式化或缺少必填字段 |
500 | Internal Server Error | 开发人员应避免此错误。如果错误被全局捕捉到,堆栈信息应记录在日志中,并且不应该写入到响应体中 |
错误信息
1 | { |