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

251 天前
 param

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

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

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

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

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

2549 次点击
所在节点    问与答
32 条回复
dzdh
251 天前
非要定一个比较合理的规范的话。可以考虑 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
251 天前
@dzdh 如果要细分的话,很容易选择困难。。所以业务层的异常还是统一同一个码就好了。
otakustay
251 天前
毫无疑问的 400 吧
dzdh
251 天前
@param

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX