一个接口,好几种情况,但根据 restful 规范,这几种情况都属于 401 ,但是我又想区分这几种情况,做不同处理,该怎么办呢????
返回信息内包含咯,状态码不可能描述得了所有业务,然后最好信息都是i18n,这样就更好了,或者你可以自己定义一系列状态码来标定你的业务情况,另外提供给客户端。
401是HTTP Status Code,建议HTTP Status Code只用于描述HTTP协议层状态,不包含任何业务状态,在具体的返回信息里使用独立的机制细分业务状态。 比如协议上表达未登录一律返回401HTTP状态,但在返回结构里会使用{“status”:“001”,“message”:“未登录”}、{“status”:“002”,“message”:“登录超时”}这样的业务状态。
hh
@libook 非常好,不過按實踐經驗來看,前端客戶端一些請求框架,非200的返回自己就throw了。所以我們現在的具體實現是,即時是業務錯誤,也返回200,再再自己定義的返回結構里描述詳細的錯誤碼,錯誤信息。
涉及到i18n的問題,其實服務端不好處理。
支持 @libook 的答案,我这有个比较统一的方案 在401错误返回
{ codeError: 'password_error', message: "密码错误" }
{ codeError: 'account_not_exist', message: "账户错误" }
@captainblue2013 涉及到 i18n 可以根据 codeError 自己定义. 或者后端更具请求的语言返回不同语言的message
例子:
www.example.com/items?lang=zh
www.example.com/items?lang=en
@captainblue2013 主要是看前端架构设计对于Error的态度吧。个人认为如果前后端都严格遵循HTTP标准的话,前端throw error是一种可预见的情况,一种架构设计思想是所有有能力throw error的地方都catch并做合理的处理,而不是避免error的出现。 i18n肯定需要一套翻译模板的,这套模板可以配置在服务端上,客户端从服务端上更新模板,将错误信息以一种固定不会变的机制套用模板展示出来,这样就可以实现服务端单方维护了。
@libook 所以这就要根据实际情况来拟定一个最佳实践,因为当其时确实很多不成熟的模块在用,比如 fetch , axios都有这个问题。(时间久远,不知道现在修复了没)
强烈不建议所有请求都返回200,然后再响应中用各种状态码去标识响应结果。这是一种令人匪夷所思的做法,明明有完整的HTTP规范为何不用? HTTP状态码可以用来区别响应结果的大类(客户端错误还是服务端错误),然后结合详细的业务响应码来更详细说明情况。一般的HTTP客户端在4XX,5XX的情况下抛异常是很正常的,捕获异常后的动作需要自己处理。而且有些响应码你用200去模拟就很奇怪了,比如302。 还要考虑到后端对于日志处理的问题,有异常的请求走异常日志,正常请求走正常日志,混在一起日志不好分类和检索。