立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 141|回复: 5

[讨论] 为什么那么多公司做前后端分离项目后端响应的 HTTP 状态一律 200?

[复制链接]
发表于 2025-6-30 07:07 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
到底为什么那么多公司做前后端分离项目后端响应的HTTP状态一律200?我真是难以理解......把5xx和4xx都包装成200给前端。前端需要多拿一层body不说 ,在feign之间的调用每次都要判断 if  response.success?xxxx。。。。。
else throw new xxxexception。。。
您是闲自己代码行数没达到考核吗



原文地址:https://www.zhihu.com/question/513865370
楼主热帖
回复

使用道具 举报

发表于 2025-6-30 07:07 | 显示全部楼层
我现在是坚定站200的。
我刚入门的时候,也按4500老老实实返回,url设计成(自以为的)restful风格。然后有一次对接某个前端,他说“你的借口出错的时候能不能不要给400,我这里balabala(一些前端内容)”,我觉得我这样搞还省心(比如之前db操作错了要返回500,url错了要返回400,烦得很),然后就一发不可收拾地远离restful
另外今天遇到一个事。
我们公司有个老系统是一个高手设计的,至少我看来是很restful的,文档也很详细,我们内部也在用其实也很好用,比如get /task/1表示查task1,url里不是数字就返回40x,数据库挂了返回50x(让我来搞肯定是 不限制请求方式/get_task?id=1,一律200,返回code msg data的json)
今天这个系统发给客户用,我负责对接。客户表示请求报错了,问他啥错就说错误码400,问返回内容,不知道。(其实后来发现返回内容就是 输入有误 id需要是数字,后来让他用postman发了下看看)
我很奇怪为什么会没有返回内容,(返回400而没有返回内容,网络良好下概率非常非常低),然后问他是怎么请求的,他把代码直接发过来了,一看是c#的webhttprequest库拿到400状态码会抛异常,然后客户程序员处理有问题,就没拿到返回内容。
2024年4月9日再补一句
昨天有个客户给我们系统发请求出错了,问他啥错就说错误码400,问返回内容,不知道。质问我们公司为啥不去他们公司帮他,要他用postman发表示不知道postman是啥(系统部署在他们内网,看日志有点麻烦)
(我以后再也不想回4xx 5xx了)
回复 支持 反对

使用道具 举报

发表于 2025-6-30 07:07 | 显示全部楼层
不对现状置可否。只是回忆一下以前的年代。
在运营商劫持横行、HTTPS 未普遍之前,基本上你不可以信任任何非 200 的响应码。
比如你返回一个 404,它会把你的返回完完全全变成另一个 HTML 代码(对,即使你是 JSON),里面全是运营商劫持的广告,甚至有些就是运营商官方的一些页面(升级宽带、网速测试云云)。
这就是当年我为什么一直用 200,且在 JSON 中再写个状态码。
当然,这种情况现在已有好转。
回复 支持 反对

使用道具 举报

发表于 2025-6-30 07:08 | 显示全部楼层
200说明接口调通了。

从浏览器到后端,中间有环节没通的才应该返回5XX,4XX。比如后端单体服务/微服务崩溃了或者没启动:404 Not Found 。Nginx没配置好:502 Bad Gateway。 网关超时: 504 Gateway Timeout。


注意这些情况下的请求都压根还没到达业务代码,故障都还在框架层面,不是业务代码层面的故障。可以这样区分:如果报错的位置,不是你项目里的代码,也就是说你打断点断不到那个位置,那就是框架层面的故障。

只要是后端调通了,请求到达业务代码了,确实应该返回200。你也可以约定业务代码也能返回50X类型的错误码,但这样你就不好区分了,不能立即判断一个故障是框架层面的还是业务代码层面的。
回复 支持 反对

使用道具 举报

发表于 2025-6-30 07:09 | 显示全部楼层
用于分离外网错误还是内网错误
如果一律返回200,却收到了非200的结果,就说明外网出问题了,可能是运营商缓存服务器的问题,可能是DNS污染等等
而内网错误则在200返回的内容里用code来表示,就可以很好的定位问题


很多人开发的时候因为都在内网测试,没有遭遇过外网错误,所以就会觉得这种做法很多余
但在实际使用中,尤其是服务器和用户跨国甚至跨洲的情况下,整个外网传输过程并不稳定,可能会出现各种异常,这种情况下这种一律返回200来区分外网错误和内网错误的做法就显得非常有价值了


举个例子吧,众所周知vercel免费版不大稳定,有时候会503。如果我把自己内部代码错误也http返回503,那么client侧就无法辨别到底是我的代码出问题了还是vercel炸了。如果我用http返回200,code503的办法,client得到了http503那就可以提示用户是vercel炸了而不是我代码出错了,code503才是vercel没炸而我代码炸了。这种思路在白嫖很多免费而不稳定的云服务时非常有用,尤其是如果同时部署了vercer,glitch,heroku等多个平台,可以通过http code判断平台是否爆炸而自动冗余切换其他平台继续服务,对于吾等没钱买pro套餐的用户来说非常好使
回复 支持 反对

使用道具 举报

发表于 2025-6-30 07:09 | 显示全部楼层
post+json团队都下班回家抱老婆了,restful原教旨主义团队还在加班查错,还拉着运维陪他们。
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表