HTTP接口设计规范

289 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简介

RepresentationalStateTransfer(REST),一组描述资源状态转换的约束条件和原则,满足这些约束条件和原则的设计或应用称之为RESTful。本文仅仅涉及HTTP中的REST。遵守REST的意义在于,除了能统一URI⻛格外,主要是为了:能充分利用HTTP协议的语义,无需重复自定义一些不够通用的自定义header或者 body格式。遵从HTTP相关规范,对推进其他服务治理的中间件有积极意义,如网关/API管理等

概念

  • 资源(Resource): 对象的单个具体实例,可以是一篇文本/一张图片/一种服务等,使用特定URI定位。
  • 表现层(Representation): 资源的具体表现形式,具体到HTTP协议里就是Accept和Content-Type。
  • 状态转化(StateTransfer): 通过交互,使资源状态发生变化.具体到HTTP协议里就是,用戶通过GET/POST/PUT/DELETE等方法改变服务器资源状态

规范

URI标准格式

URI = [http|https]://domain[:port]/path[?query][#fragment] 使用连字符-代替下划线_的使用统一使用小写字母

接口版本规范

http://域名/[业务名]/api/[版本]/

以资源为中心设计URI

  • 不使用动词
  • 使用名词复数形式
/api/v1/teams (资源列表)
/api/v1/teams/123 (单个资源) 
/api/v1/teams/123/members (关联资源)
  • 资源嵌套层级不超过三级
  • 无法转化为名词的动作转化为服务名词
# 将用戶1授权为⻆色1
/api/v1/assign/:user1/to/:role1 # 原始 URI
/api/v1/assignment?type=role&src=user1&dst=role1 # 转换后的 UR

使用HTTP方法实现CRUD操作

各HTTP方法的CURD副作用

方法响应格式是否幂等
GET单个对象/集合
POST新增成功对象
PUT更新成功对象
DELETE

常规CRUD

  • GET查询
GET /api/v1/users # 获取用戶列表
GET /api/v1/users/1 # 获取用戶1信息
  • POST新增
POST /api/v1/users # 新增一个用戶
{"name": "wangerxiao"}
  • PUT更新
PUT /api/v1/users/1 # 修改用戶
{"name": "Wang Erxiao"}
  • DELETE 删除
DELETE /api/v1/users/1 # 删除用戶1

非常规的CRUD

  • 转化为对资源的CURD操作
POST /orders/123/assigned # 订单签收
PUT /orders/123?type=assigned # 订单签收是对对订单资源的更新,可将动作后置到query参数
  • 复杂查询和分⻚ 使用合适的query参数过滤,query参数定义大概如下:
参数名参数说明备注
state资源状态
type业务类型
from开始时间点(闭合)
to结束时间点(开放)
limit指定返回记录数量
offset记录开始位置
direction请求数据的方向,取值prev-上一⻚数据;next-下一⻚数据
page第几页
size每页条数
total总记录数
sort排序字段
orderby排序规则

Request&Response规范

RequestBODY

Content-Type

  • 使用application/json,不建议使用application/x-www-form-urlencoded。
  • multipart/form-data只在上传文件时使用
  • POST新增资源时,包含资源所有不可空字段
  • PUT修改资源时,所有包含字段都会被更新

ResponseHTTPStatus

常规返回码

  • 2XX:请求正常处理返回
  • 3XX:重定向 301永久重定向,标示资源已经使用新的URI 302临时重定向,常用于登录跳转 304命中缓存
  • 4XX:客戶端请求有错误 400参数缺失或不合法 401未登录 403没有权限 404资源不存在
  • 5XX:服务端错误

非常规返回码

其他返回码极少用到,可参考HTTPStatusCode或者RFC7231

ResponseBODY

建议封装成{code、msg、data}

{
  "code": xxx, // 可以自由定义,正常响应为 200,错误响应可自行斟酌
  "msg": ""// 错误响应消息
  "data": null  // 正常响应实际数据
}