想给所有的业务异常一个统一固定的 HTTP 状态码,用什么合适? 403? 409? 422?

2023-09-01 10:08:49 +08:00
 param

http 状态码能不能用-1 的。

不要 200 ,那样我就要在 response 再包一层。 我想给业务异常统一固定的 HTTP 状态码,例如 403 ,那么我遇到 403 才会拆开看里面的业务异常,在 403 的 response 里返回大写字母格式的错误码以及 err msg 。如果遇到 200 ,就默认没有异常,不需要拆开了。

业务异常指的是,诸如「未完成的订单不允许评论」之类的

403 经常被认为是「权限不够,换个身份操作就可以成功」的意思,但它其实应该是「 forbidden 」,没有说明是权限不够而 forbidden ,或者其他原因的 forbidden 。具体原因还是可以在 body 里看。

这个问题在这里好像吵得很厉害,我不想对 200 再封一层,同时也需要自定义的状态码,这完全不矛盾呀。

2891 次点击
所在节点    问与答
32 条回复
dzdh
2023-09-01 10:12:51 +08:00
非要定一个比较合理的规范的话。可以考虑 guzzle 的封装

由于提交的参数有问题的 4xx

- 资源不存在( id?=x ) 404
- 缺少参数,参数不合法 400
- 不能操作这个资源 (?id=xx ) 403

class X extends Exception {}

class X404 extends X{}

class X400 extends X{}

class ResourceNotFound extends X404 {}
param
2023-09-01 10:14:53 +08:00
@dzdh 如果要细分的话,很容易选择困难。。所以业务层的异常还是统一同一个码就好了。
otakustay
2023-09-01 10:17:24 +08:00
毫无疑问的 400 吧
dzdh
2023-09-01 10:17:35 +08:00
@param

我是统一 200 code, result, mark, data :doge:
xfn
2023-09-01 10:20:03 +08:00
我的理解是如果是调用方的问题返回 4xx ;服务提供方的问题返回 5xx ;你这种情况应该是调用方没有满足业务期望的条件,个人认为 400 比较合适
mritd
2023-09-01 10:20:23 +08:00
感觉应该 400 好点吧, 不过确实很多业务系统喜欢 200 all in... 他们却是也有一些理由, 就是某些 http 库非 200 可能抛 异常啥的; 不过我没写过客户端还是不太了解, 我个人理解 HTTP CODE 应该是更高层次的、笼统一点的错误提示, 而内部 body 可以附加业务层次的特定错误描述.
param
2023-09-01 10:21:10 +08:00
@otakustay 请求格式错误才是 400 吧,例如本该用 application/json 的却用了 multipart/form-data
otakustay
2023-09-01 10:25:53 +08:00
@param #7 所有客户端的错误都是 400 ,请求格式错误 415
fredweili
2023-09-01 10:29:50 +08:00
除了 code ,还能再传一个 header
param
2023-09-01 10:32:22 +08:00
@fredweili 咦,这么说,错误码直接放 header 就可以
param
2023-09-01 10:33:16 +08:00
@fredweili 那问题来了,header 用什么名好呢。
grissom
2023-09-01 10:39:14 +08:00
那明显是 http 定义的以外的任意 code 了
28Sv0ngQfIE7Yloe
2023-09-01 10:41:26 +08:00
CodeCodeStudy
2023-09-01 11:02:42 +08:00
不要修改 HTTP 状态码,HTTP 状态码应该是由 Nginx 之类的 web 服务器来掌控,业务上的状态应该自己搞一套状态码来表示。
如果是 401 的话,比如 Nginx 设置了 auth_basic ,需要输入用户名和密码,用户名和密码不对的话就是 401 。
如果是 403 ,那就是不给看就不给看。
个人建议使用自定义的业务的状态,用大于 1000 的数字来表示。
zjw7sky
2023-09-01 11:06:07 +08:00
这样是不是不利于拓展
iOCZ
2023-09-01 11:09:25 +08:00
建议区分 http status code 和 business status code
loading
2023-09-01 11:12:44 +08:00
我觉得合理的方法是:
api 正确响应了就返回 200 ,把 http 状态码留给网络问题。

api 的错误,例如找不到货物(不是 url 找不到的 404 ),就 HTTP 200 ,然后返回的数据一般是这样:

{
code:404,
msg:'找不到货物',
data:[]
}

其中 code 部分参考 http 的码来做,msg 是给人看的信息,或者作为提示信息。

我非常喜欢这种方式,希望能帮到你。
dallaslu
2023-09-01 11:19:56 +08:00
按规范来吧,只用标准的 http 状态码,其他业务上的错误码请在 body 里自行定义
QlanQ
2023-09-01 11:41:26 +08:00
名字就叫 http 状态码,为什么要和业务相关?
如果你用户名密码错误,这是 业务上的错误,http 的请求是成功的

从后续处理上来讲,前端在遇到不是 200 的情况的下,都是不解析具体 响应的,不是 200 就被认为是 请求有问题,
和断网类似
zerduo
2023-09-01 11:45:25 +08:00
那你不随便嘛,只要是 http 状态码,统一就行,跟前端定好了无所谓,一个数字而已

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

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

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

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

© 2021 V2EX