API 不管操作成功还是失败都返回 200 状态码,自己在返回结果里又定义一个表示是否成功的属性是从哪里传开的坏习惯?

2022-12-03 21:22:25 +08:00
 edis0n0
一直以为是从阿里开始传到整个中国互联网企业的坏习惯,最近发现一些日本网站也都这样做。但欧美网站大部分不这样做,例如 stripe ( https://stripe.com/docs/api/errors) twitter 等,都是规范的使用 http 状态码表示操作成功或失败,但 google 一些没有公开文档的私有 api 返回状态也非常混乱
8372 次点击
所在节点    程序员
93 条回复
zaunist
2022-12-04 21:15:51 +08:00
@edis0n0 4xx 码不够用,总不能每个错误都是 400 BadRequest 吧。。。
edis0n0
2022-12-04 21:18:39 +08:00
@zaunist #80 为什么不可以,我是想用状态码代替原来的 success: bool ,如果不想区分太细 200 和 400 就够用,只是 40x 还可以再细分而已
iseki
2022-12-04 21:28:32 +08:00
有些人总喜欢不管成功与否皆返回 200 ,于是为了鉴别成功失败(会对应不同的响应体 schema ),必须给所有请求的响应体包裹一个 wrapper ,彻底侵入响应体,既不考虑违反 HTTP 带来的麻烦(监控等等),还导致响应体必须是个 JSON (不然没法包裹了),美其名曰方便区分「系统异常」「业务异常」,实际上连故障和错误都没划分明白(这里点名批评 Java 的 Exception 类型)。
更有甚者,包就包了,他还把成功和失败时的内容载荷给你丢到 wrapper 的同一个字段里,导致必须先把 JSON 解析一次,知道了是成功还是失败,才能用正确的类型把载荷再映射一次,病得不轻。
holinhot
2022-12-04 21:28:49 +08:00
http 状态码用来表述协议链路状态(例如 503 504 400 ),自己 body 里定义的状态码用来表述业务逻辑的处理状态。
两种本来就不冲突,现实是很多人拿来混在一起,故障排除时反而不好弄。
night98
2022-12-04 23:11:58 +08:00
securityCoding
2022-12-04 23:29:17 +08:00
一个是协议,一个是业务很难理解吗? rpc 上网关不用业务码用什么?业务千奇百怪各种状态码需要定义和透传
akira
2022-12-05 00:11:04 +08:00
200 表示系统一切正常,这样是不是好理解很多了
IvanLi127
2022-12-05 00:20:08 +08:00
这个坏习惯导致各自闭门造车,不知道为什么有人喜欢浪费现有资源,自己再套一层。那群以 http 状态码不够覆盖业务错误的,想想自己是不是被 http 限制了想象力!而且在 HTTP 上封装自己的协议后,居然不提供相关工具链,简直就是重复劳动,瞎卷。

异常响应没必要和正常相应走同一套逻辑,给正常响应套一层完全没意义。还有,HTTP 标头那么好的东西,不要浪费!
vitoaaazzz
2022-12-05 09:25:56 +08:00
http 状态码的表达力有限,不是 200 打天下就是 200+400 打天下,很多错误你确定能找到对应的状态码?就算用了少部分意义适当地状态码,不还是要在返回结果里再定义错误码?
knives
2022-12-05 19:42:25 +08:00
月经贴……然后我也回过几次类似的回复:为什么不全都要呢 :doge

状态码和响应体一起用并不冲突。Http 状态码用来区分正常响应和错误响应,响应体中给出具体的错误码。当然,200 状态就没有错误码这一封装了。
也许这有点多余的认知成本,但实际上用得最多的就三状态:200 (这个甚至不用写),400 (用户输入错误),500 (服务端错误)。这不比各种业务面条来得复杂吧……

再进一步说,新的 Spring6 开始支持 RFC 7807 规范: https://www.rfc-editor.org/rfc/rfc7807 ,规定了异常信息如何返回。可参考: https://www.51cto.com/article/721281.html 。基本思路就是异常产生时的响应特殊 header 和 json body 。

当然以 Java17 的实际普及程度来看广泛要升级到 Spring6 还有相当长的时间,但我已开始期待,观望等 Spring6 普及了这一月经贴的内容是否会有所变化😀
zaunist
2022-12-07 09:17:10 +08:00
@edis0n0 业务上的报错有很多种,统一 400 ,前端如何区分是哪种错误,还不是要引入 "code:"
flmn
2024-01-03 13:39:17 +08:00
lizy0329
253 天前
混合用最好,讲真,你封装时候,无论是 外面的 status 还是里面的 code ,都需要处理

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

https://tanronggui.xyz/t/899875

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

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

© 2021 V2EX