Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于前后端接口定义 #17

Open
hjzheng opened this issue Jul 22, 2016 · 3 comments
Open

关于前后端接口定义 #17

hjzheng opened this issue Jul 22, 2016 · 3 comments

Comments

@hjzheng
Copy link
Member

hjzheng commented Jul 22, 2016

最近在项目开发过程中,作为前端leader,发现前后端联调的时候,花费的时间特别多,按理说在接口定义清楚的前提下,联调是非常快速的。

然而事实上,当我仔细阅读接口文档后,发现很多东西,并未定义清楚,或者压根没有。

那么一个完善的接口文档应该是什么样的?

1.首先接口的设计,需要遵循REST原则,如果有同学不懂REST,可以看看这篇文章 #4
2.接口的名称及作用描述。
3.接口的URL和请求时使用的HTTP Method。
4.接口的请求格式及参数包括参数类型,参数默认值,参数描述。
5.接口可能返回的状态码,及每个状态码下的响应类型和格式。

以下是一个接口文档的示例:

ticket列表

用于获取ticket列表,带分页功能

接口:

GET /tickets

请求参数:

名称 类型 定义 必需 默认值(default) 说明
name string 查询name "" 作用于name
pageNum number 页码 1
pageSize number 每页大小 10
status number ticket状态 -1 参考ticket状态枚举说明
orderBy string 排序字段名称 "id" 可以使用"id"或"name"
order string 排序方式 "asc" 可以为"asc"或"desc"

其他说明
ticket状态枚举 {-1: '全部',0: '关闭',1: '开启'}

响应:

成功:200

响应格式:JSON

   {
       "pageNum"{number} {default: 从请求获得}// 页码
       "pageSize":   {number} {default: 从请求获得}// 每页大小
       "totalCount": {number} {default: 0}, // 总数
       "results": [ // {number}  结果集
           {
               "id": {number}, // 必填
               "name": {string} {default: null},  // ticket name
               "status": {number} {default: null}, // ticket状态 参考ticket枚举说明
               "createTime": {number} {default: null}, // 使用timestamp,方便前端转换
           },
           ...
       ]
   }

登录超时 / 未登录: 403

参考标准403响应

服务器内部错误: 500

参考标准500响应

另外我们还需要提供一些标准响应格式约定:

  • 分页列表格式, 不分页列表格式
{
     "pageNum": {number} {default: 从请求获得}, // 页码, 不分页列表 为 null
     "pageSize":   {number} {default: 从请求获得}, // 每页大小,不分页列表 为 null
     "totalCount": {number} {default: 0}, // 总数, 不分页列表 为 null
     "results": [ // {number}  结果集
            ... ...
     ] 
}
  • 删除,更改和添加后响应格式:
    • 成功: 返回操作实体的简单信息,方便前端通知用户
    • 失败: 用 HTTP 状态码 表示, 返回错误 message 和 errorCode 参见 500 相应格式
{
       "id": {number}, 
       "name": {string}
}
  • 403响应
  • 500响应
{
    "message": {string}, // 友好的错误信息,可选,如不提供前端应当使用默认的提示信息
    "errorCode": {number} // 可选择性提供 errorCode 便于后续问题排查,可选
}

后端可以针对不同的响应格式创建不同Java类,其他同学只需继承对应的class,而前端同学针对500和403可以使用AngularJS拦截器统一处理。

最后再强调一点,接口如果一旦定义清楚后,如果需要改动,一定要及时通知到相关同学,所以建议将修改接口权限控制在专门人手里。

关于接口的设计,可以参考
https://github.com/ecomfe/ub-ria/wiki

推荐一个接口定义工具 https://github.com/thx/RAP

@kuitos
Copy link

kuitos commented Jul 25, 2016

不要用status标明 成功/失败 的状态,状态短语统一用 状态码 表明,错误信息以响应体方式给出。
公司有一篇写的非常棒的rest规范,建议看这个:REST规范

@hjzheng
Copy link
Member Author

hjzheng commented Jul 25, 2016

OK,其实这几个接口定义也是参考老客服的设计。

@Knight-ZXW
Copy link

@kuitos 你这个是公司的吧,看不了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants