前后端交互规范

  • 工作流程优化
  • Requests(请求)
  • Responses(响应)

工作流程优化

产品研发过程中,"前后端分离"开发模式下的前后端协同开发流程优化如下:

前后端协同开发流程较之前不同的是,添加了 “接口评审” 过程,此过程是对程序设计产物 接口文档 接口 的评审及确认,旨在解决实践中遇到的以下问题:

  1. 无接口文档,口述沟通
  2. 接口功能不完善就提前进入联调
  3. 接口功能拆分的维度不合理
  4. 接口功能测试依赖前端界面
  5. 接口格式规范存在多种:WCF Server(.svc) 和 Web API
  6. 接口请求方式无语义
  7. ...

Requests(请求)

1、语义化请求的方式

在 RESTful 架构中,对于资源的具体操作类型,由 HTTP 动词表示。常用的 HTTP 动词有(括号里是对应的SQL命令):

  • POST(CREATE):在服务器新建一个资源。
  • DELETE(DELETE):从服务器删除资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • GET(SELECT):从服务器取出资源(一项或多项)。
  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
axios({
    url: '/api/v1/users',
    method: 'GET',
    ...
})
...

2、应该将 API 的版本号放入 URL

需求迭代过程中,接口难免会发生调整,给接口加上版本使之更易于维护。

https://api.example.com/api/v1/

3、路径和属性要小写

为了和域名命名规则保持一致,使用小写字母并用 - (中杠)分割路径名字,例如:

service-api.com/users
service-api.com/app-setups

属性也使用小写字母,但是属性名要用 _(下划线)分割,以便在 JavaScript 中省略引号。例如:

{
    "service_class": "first"
}

针对 C# 项目,属性的命名规范,可采用驼峰形式(如果可能,建议使用上面的方式):

{
    "serviceClass": "first"
}

注意:同一个项目,属性的命名规范,只能采用一种。

4、通常情况下,请求的 body 体使用 JSON 数据格式

通常情况下,服务端接收到的数据格式为 JSON 字符串。

// 通常:
// Content-Type: application/json
axios({
    data: JSON.stringify({...}),
    ...
})
...

// 特殊:表单提交
// Content-Type: application/x-www-form-urlencoded

// 特殊:文件上传
// Content-Type: multipart/form-data

Responses(响应)

1、使用 JSON 作为数据传输格式

服务端返回的数据格式,应该只使用 JSON,避免使用 XML。

2、保证响应的 JSON 最小化

  1. 只返回业务所需的资源;
  2. 请求中多余的空格会增加响应大小,应去掉;
  3. 开启压缩模式;

3、返回合适的 HTTP 状态码和业务返回码

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

业务码的设计需是全局唯一的,可参考微信公众平台的接口返回码说明。

4、提供资源的(UU)ID

在默认情况给每个资源一个 id 属性。除非有更好的理由,否则请使用 UUID。不要使用那种在服务器上或资源中不是全局唯一的标识,尤其是自动增长的 id。

生成小写的 UUID 格式 `8-4-4-4-12`,例如:

[{
    "id": "01234567-89ab-cdef-0123-456789abcdef",
    ...
}, {
    "id": "01234567-89ab-cdef-0123-456789abcdef",
    ...
}]

5、使用 UTC(世界标准时间)时间,用 ISO8601 进行格式化

仅接受和返回 UTC 格式的时间,IOS8601 格式的数据,例如:

{
    "finished_at": "2012-01-01T12:00:00Z"
}

results matching ""

    No results matching ""