采取 RESTful 风格的 api 是否应该对结果包一层?

2019-10-21 23:18:13 +08:00
 h82258652

RT,今天公司的新项目开始对接,app 端的一看我这接口就吐槽我。让我改成如下这种: { "code": 200, "message": "", "data": xxx }

但我觉得首先这 code 肯定是多余的,可以直接从 http 状态码里面读取。之前也看过 twitter 的 api,也没有说包一层,200 的话那就直接返回 data 了。 公司项目我就忍忍算了,毕竟人家老员工。但后面有自己项目的话,还是想弄标准一点。不知道一般来说,大家是怎样实现?

25755 次点击
所在节点    程序员
305 条回复
IvanLi127
2019-10-22 08:52:33 +08:00
总感觉在非 200 的情况下包一层自定义信息似乎蛮折中的
Varobjs
2019-10-22 08:54:23 +08:00
封装一层还得有必要的,
业务错误不能全部靠 http status 来处理,比如当前来不及处理,请重试,调用方如何判断这种情况,然后重试,只能通过 code 啊。
Ianchen
2019-10-22 08:55:34 +08:00
把 Http 状态码再自己包装一层, 我个人觉得是没意义的事. 但是自定义 code 我是一直在用的, 并且就楼里所说, 我觉得什么情况下错误码够用? 你要自己去思考. 我在给公司设计错误代码规范的时候是规定, 如果前端需要服务端返回特定的 code 码来处理一些后续逻辑, 则给固定一个唯一的, 如果不需要, 仅仅是错误提示, 只要统一的错误码即可. 错误码在大部分情况下对前端及用户来说是无任何意义的(除非你想跟踪问题, 但是跟踪问题, 日志就可以了). 当然这种情况在写开放 api 接口的时候会参考 A,T 的错误码
tt67wq
2019-10-22 08:56:44 +08:00
@chendy 可是蚂蚁金服和微信平台的 API 接口都是有业务错误码的
zsdroid
2019-10-22 08:57:04 +08:00
@h82258652 #32 你这样做,数据结构不统一啊
vbonluk
2019-10-22 08:57:42 +08:00
建议楼主可以看看微信微博等等 sdk 的接口,一般会包一层,用于自定义状态码。前端根据不同状态码不同处理。
eason1874
2019-10-22 08:58:25 +08:00
@h82258652 #34
@ampedee #39

那是我理解错了。我看楼主帖子只说了可以从 HTTP 状态码读,没说仅限 200 状态,我以为楼主跟评论区说 HTTP 状态码够用的一样。
Orenoid
2019-10-22 08:59:24 +08:00
我都不知道是第几次在 v 站看到这个问题了
Narcissu5
2019-10-22 08:59:33 +08:00
@yamedie

{ "code": 7001, "message": "短信验证码已失效", "data": null }
{ "code": 7002, "message": "短信验证码错误", "data": null }
{ "code": 7003, "message": "尚未发送短信验证码", "data": null }
{ "code": 7010, "message": "当前手机号已领取过会员权益,请勿重复领取", "data": null }
{ "code": 9001, "message": "登录已失效,请重新登录", "data": null }

毫无意义,99%的情况下前端根本不会在意为什么出错了,前端只需要知道请求成功或者失败了,失败了把错误消息弹出来就完了,http 200 足已

最重要的是

封装之后无法做监控
封装之后无法做监控
封装之后无法做监控

重要的事情说三遍
harde
2019-10-22 09:00:06 +08:00
http 代码用来表示通讯层状态。
code 用来表示业务代码,没毛病。
xuanbg
2019-10-22 09:02:35 +08:00
错误通过 HTTP 状态码识别的怕是没真实实践过吧?就说 404 好了,到底是服务不存在呢?还是接口不存在呢?还是资源不存在呢?懵逼了吧。

如果是封装的,那前端判断问题就简单多了。http404,那就是服务没起或者接口没写好。code404,那就是服务一切正常,而是真的没这个资源。
baiyi
2019-10-22 09:03:25 +08:00
200 直接返回数据,非 200 再返回业务码,也不要带上 {"data":null} 这样的字段,太蠢了

唯一要考虑的是 ios,根据他使用的框架和语言,要考虑将 [] 封装为 {}
binux
2019-10-22 09:03:59 +08:00
成功的时候直接返回对象就行了,错误有错误的 object 定义,里面再用 code。
yuan7712
2019-10-22 09:04:11 +08:00
@Narcissu5 前端很多场景并不是只关心成功失败,其次封装之后也是可以监控额
Ianchen
2019-10-22 09:05:16 +08:00
@yamedie 我觉得短信 70xx 的代码无任何存在的意义, 用户不关心错误代码是什么, 前端拿到错误代码也不做任务处理, 何必花时间与精力去维护越来越多的错误代码呢? 服务端写返回的时候还要去查代码是不是已经存在了. 这种错误包括但不限于: xx 输入不合法, xx 未填写, 校验不通过, 提交失败等 统一一个非 0 的 code 即可如 code: -1, 可适用于绝大部分的逻辑中断返回
caryqy
2019-10-22 09:05:43 +08:00
HTTP 的那几个码不够用
fiypig
2019-10-22 09:07:10 +08:00
难道你们都没 code 的吗 , 我蒙蔽
Narcissu5
2019-10-22 09:07:47 +08:00
@eason1874 实际上登录这种错误就只能返回统一的 forbidden,过于详细的信息是漏洞。我们刚刚被审计逼着改掉
yc8332
2019-10-22 09:09:21 +08:00
明显那个不是你说的 http 状态码,而是业务里面的错误代码。。
h82258652
2019-10-22 09:09:57 +08:00
@vbonluk 微信我没弄过,但是微博我之前开发 app 集成过。但实际上微博的 error code 我也只用了 access token 过期这个,其它直接显示个 message 就是了。另外吐槽一句,微博扔回来的 error code,有些压根文档里找不到的……

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

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

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

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

© 2021 V2EX