[规范制定征求] 后端 API 接口返回值

2019-10-30 15:12:29 +08:00
 odirus

前言

我们公司正在快速发展状态,是时候开始制定各项技术标准规范(各种技术栈的语言规范)和工作流程从开发、测试到上线等)了,否则后期越来越玩不转。

前期虽然有引进各种规范,但总是支离破碎,而且有很多地方也不太符合我们公司工程师口味,所以也没有继续执行下去。

最近我们在开始整理各种技术规范和流程,会经历以下流程:

今天我们公示一下我们公司的初稿,并解释其中的原因,也广泛征求大家的意见和建议,大家的每一条建议我们都会深入思考和论证的。后续我们还会有很多类似的规范拿出来和大家一起交流,不吝赐教。

后端 API 返回值规范初稿

规范针对群体

服务端、服务端对接端(网页端、APP 端、小程序端)

规范细节

  1. 当服务端鉴权失败时返回 HTTP Status Code 401
  2. 中间环节三方软件返回的标准错误码,例如 Nginx 返回的 5** 错误码
{
  "resultCode": 200,
  "data": null,
  "errorMsg": ""
}
  1. resultCode 表示服务端处理结果代码,用 3 位数字表示通用处理结果代码,用 4 位及以上数字表示业务处理结果代码,通用处理结果代码有:
    200 表示处理成功
    400 表示参数错误
    500 表示服务器内部错误
    503 表示当前服务不可用
    504 表示网关超时
  2. data 表示返回的数据,如果没有数据时返回 null
  3. errorMsg 表示错误时的返回信息,如果没有错误时返回空字符串,始终不能为 null
{
  "resultCode": {通用处理结果代码},
  "data": null,
  "errorMsg": "对应的错误消息"
}

针对初稿里面的若干问题思考,也希望大家多提意见和建议

之前我们的流程是,APP 内如果需要打开网页,则需要通过一个固定的链接进行转换,例如本身要访问 a 链接,则务必访问跳转链接并添加参数 b?targetUrl=a,同时携带 APP 的鉴权参数( APP 我们是把鉴权参数放到 header 里面的),服务端拿到 APP 的鉴权信息后会回写 cookie 到网页中,同时引导跳转到真正的目标地址 。

上述流程里面就会出现一个问题,当 APP 里面的鉴权信息( Token )没有过期,但网页中的鉴权信息过期了(例如一些不可抗拒因素导致某台服务器丢失了网页端的 session ),用户再点击网页里面的内容,则始终会报告失败,给用户一种很不好的体验。

之前我们是通过 bridge 的形式由网页端通知 APP 端发起重新跳转,如果本次跳转 APP 鉴权信息依然有效则按照前述流程正常打开网页,如果本次跳转发现 APP 的鉴权信息也失效了,则引导用户在 APP 中重新登录。 根据我们的经验,bridge 这种方式很容易出现兼容性问题,在某些机型上无法通知 APP,导致用户始终卡在网页上(用户并不知道要重启 APP,只知道找客服)

为了让用户得到更好的体验,我们打算在 APP 层面捕捉 webview 的所有请求,一旦发现 HTTP Status Code 为 401 的情况,就引导 APP 重新登录,简单粗暴,不过会忽略 APP Token 有效,网页 Token 无效这种情况。

如果把 401 放到返回 body 里面,不方便 APP 统一捕捉返回信息。

如果按照上述我们的方案,我们的接口需要接收 cookie 这种鉴权方式( APP 内打开的网页通过 ajax 调用),也需要接收 header 这种鉴权方式( APP 直接请求);我们的网页需要接收 header 这种鉴权方式( APP 通过跳转链接打开目的网页时),也需要接收 cookie 这种鉴权方式(正常情况下都通过 cookie 认证)。

5636 次点击
所在节点    分享创造
27 条回复
odirus
2019-10-30 18:02:05 +08:00
@Vegetable

我们也做了一些讨论,觉得你的方案很不错,当 APP 访问网页时就把 token 放到链接中,当网页里面打开其他链接时也把 Token 带上。

但有一个问题,如果用户不小心把这个东西分享出去了,那就很危险了,相当于泄露了这些信息。

你们是如何处理这个问题的呢?望解答,谢谢
diferent
2019-10-30 19:32:00 +08:00
很简单, 就是做的系统不够大, 不够复杂,所以才会不理解 Restful. 才会觉得所有东西都放到 Body 里最简单.
Restful 的精髓就在于, 当你的系统足够复杂的时候,有 N 多层代理和路由服务时,不需要解析 Body(你也解析不起), 就可以追踪业务和进行业务分发或日志记录.
Varobjs
2019-10-30 19:39:36 +08:00
每月一次
好用就是规则,大家遵守就好,没啥讨论了
odirus
2019-10-30 19:49:56 +08:00
@diferent 所言极是。
mogutouer
2019-10-30 19:52:40 +08:00
去看 twitter,facebook 的 API 格式不就行了
Vegetable
2019-10-30 20:16:03 +08:00
@odirus 我们的场景没有分享功能
我认为只要能将客户端的身份信息传递给到 webview 就可以.url 不行还可以试试使用 http 的其他部分,比如 header 和 cookie.

我了解了一下,安卓和 ios 好像都可以拦截 webview 内部的请求添加 header,cookie 应该也是可以的.涉及到客户端那边的知识我就不太了解了,你们可以按照这个思路讨论一下,如果内部页面比较复杂,尤其是涉及到第三方页面,可能会有一点麻烦.
odirus
2019-10-30 20:44:27 +08:00
@Vegetable

好的,谢谢了。目前我们 APP 嵌入的网页也要求能够在浏览器里面正常打开,正常分享。所以有很多考虑。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX