百科问答小站 logo
百科问答小站 font logo



为什么那么多公司做前后端分离项目后端响应的 HTTP 状态一律 200? 第1页

  

user avatar   qinlili233 网友的相关建议: 
      

用于分离外网错误还是内网错误

如果一律返回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套餐的用户来说非常好使


user avatar   haozhi-yang-41 网友的相关建议: 
      

根本的原因是:HTTP协议本来就不是设计为业务系统的传输层


在HTTP协议设计之初,它是用于(基于请求/应答对的web)业务的,后面略微扩展为简单的文件传输(毕竟web也是文件)。所以,HTTP的code本来是应对web页面的业务状态的,是业务的状态码。

但是在restful的各种场景下,HTTP被当作传输层,而上面真正运行的业务却五花八门,完全脱离了web的范畴。所以,HTTP的那套code完全套不上,或者说硬套上去也很别扭:例如说404,找不到页面。当然,你可以宽泛的解释为“找不到资源”——但如果你一个业务请求中涉及到了ABC三个资源,你光一个404,怎么表示到底找不到哪个?如果你说把ABC三个资源合并为一个“虚拟资源”,那么ABC三者到底是“和”关系还是“或”关系?当然,你非要写一份完整的协议文档,详细的解释清楚你的所有的code的套用方式,也不是不行。但就算如此,如果我需要精确知道具体是ABC的哪个(例如说给用户精确的提示),不还是要在payload里折腾一番?那你看绕了一圈,不还是回来了?何必呢?


总之,既然当了传输层,就要有当传输层的自觉:作为业务系统的小配角,不要总想着和主角(应用层)抢戏。

你看看老资格的传输层,返回码(状态码)都是什么?如果是流式传输,那就是字节数。如果是包式传输,要么是包个数,要么就是简单的true/false。

而现在HTTP当作传输层了,那么它本质上是一种高级(变长、可确认、可校验)的UDP。因此,它的code只有200和非200(本质上就是true/false),就理所当然了。


user avatar   xadillax 网友的相关建议: 
      
不对现状置可否。只是回忆一下以前的年代。

在运营商劫持横行、HTTPS 未普遍之前,基本上你不可以信任任何非 200 的响应码。

比如你返回一个 404,它会把你的返回完完全全变成另一个 HTML 代码(对,即使你是 JSON),里面全是运营商劫持的广告,甚至有些就是运营商官方的一些页面(升级宽带、网速测试云云)。

这就是当年我为什么一直用 200,且在 JSON 中再写个状态码。

当然,这种情况现在已有好转。


user avatar   catchen 网友的相关建议: 
      

有见过同一家公司内混合使用 HTTP 状态码和 200 加 JSON 错误信息的吗?有见过一家公司内同一个 micro service 当中也如此混合使用的吗?这个世界没有最恶心,只有更恶心。




  

相关话题

  当人们说一个前端框架太“厚重”时,他们在说什么? 
  怎样学习才能拥有所谓“高并发”的经验? 
  github有没有办法前后端分两个项目,前端代码软连接到后端文件夹中? 
  如何看待react被围攻?技术中立存在吗? 
  如何看待知乎、饿了么后端的招聘纷纷由 Python 渐渐转向 Java? 
  为什么网页都可以查看源代码? 
  前端拿到后端的数据,不能直接用,还要再处理,这样合理吗? 
  后端开发第一次做项目,该如何实现前端页面?可以拿别人开源项目的页面过来直接用,自己写后端接口吗? 
  JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别? 
  避免使用 eval、new Function 的方法可以降低 XSS 攻击的风险吗?为什么? 

前一个讨论
开网店发现有个账号频繁在我下单,每次送货地址都不一样。怀疑有人用我这里的货另开店铺赚差价,怎么办?
下一个讨论
淘宝上一些价格便宜到离谱、标注45天发货的店铺的阴谋是什么?45天后会发生什么?





© 2024-09-27 - tinynew.org. All Rights Reserved.
© 2024-09-27 - tinynew.org. 保留所有权利