V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
m939594960
V2EX  ›  问与答

关于接口返回 Status Code 是否都应该为 200 的问题

  •  
  •   m939594960 · 2017-09-20 13:37:12 +08:00 · 5000 次点击
    这是一个创建于 2620 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我编写接口的时候 Status Code 并没有都返回 200 有部分 422 401 等等。

    在跟 IOS 对接的时候出现了一些问题,IOS 那边非常不赞同我这种返回的方式,希望我都返回 200,然后他们那边根据状态码进行判断,说返回 422 401 等非 200 状态码的返回数据处理起来比较麻烦(他们 使用的 AFNetworking 库)

    然后我这边就查阅了很多国内的网站提供的接口,淘宝、美团、微博等等确实都是返回的 200 并没有按照具体错误返回不同的 Status Code,而且返回的 body 里也没有携带 Status Code

    问下究竟应不应该按照不同情况返回不同情况的 Status Code,还是应该在返回 json 中返回具体错误码(在不考虑网络劫持的情况加)

    第 1 条附言  ·  2017-09-20 14:17:54 +08:00
    谢谢大家的回复,我这边已经准备做出调整了,不知道为什么我这边感谢点不了,就没办法感谢了!
    16 条回复    2017-09-20 17:22:09 +08:00
    Livid
        1
    Livid  
    MOD
       2017-09-20 13:41:06 +08:00
    很多 CDN 对于内容是否能够被缓存,状态码也是考虑因素之一。
    ty89
        2
    ty89  
       2017-09-20 13:43:59 +08:00
    曾经不要 b 脸的某米路由器还会拦截 404/5xx 的状态

    建议:统一返回 200,然后在数据包里自己约定一些状态码,比如 {status: 10001, data: {...}, msg: '' }
    hand515
        3
    hand515  
       2017-09-20 13:50:21 +08:00
    服务器收到并处理了建议还是返回 200。
    m939594960
        4
    m939594960  
    OP
       2017-09-20 14:03:10 +08:00
    @Livid 我思考了一下,没太明白,能麻烦详细解释一下么?
    m939594960
        5
    m939594960  
    OP
       2017-09-20 14:03:28 +08:00
    @ty89 #2 接口都上了 https 应该不太用考虑这块
    SuperMild
        6
    SuperMild  
       2017-09-20 14:15:38 +08:00
    Status Code 本来是一种通用的约定,方便不同的客户端与服务端交流,写客户端的人可以默认收到 200 就正常处理,收到 4XX、5XX 就进行异常处理。如果是面对不同人群的公开 API,最好按照通用约定去做。

    但是公司内部使用的、非对外的 API,的确可以按自己的方便来变通处理。
    bazingaterry
        7
    bazingaterry  
       2017-09-20 14:18:56 +08:00 via iPhone
    如果用状态码,可能业务情景会和服务器状态有重叠,例如说用 500 你不清楚是后端挂了还是业务逻辑上的错误。如果统一 200,出现了 500 那就基本确保后端挂了。
    asen477
        8
    asen477  
       2017-09-20 14:19:41 +08:00
    CDN 的问题,我想是通过状态来决定内容是否被缓存。
    至于状态返回建议统一请求成功反状态码 200
    DCjanus
        9
    DCjanus  
       2017-09-20 14:22:42 +08:00
    我们这一般是不统一返回 200
    这样线上监控和翻日志都比较方便,毕竟可以根据状态码找异常的部分
    当然,你也可以统一返回 200 然后自己在逻辑里写好 log,能达到同样的效果,只是我比较懒所以……
    m939594960
        10
    m939594960  
    OP
       2017-09-20 14:25:31 +08:00
    @asen477 #8 关于 cdn 的问题,错误的反 422 400 什么的不会被缓存,200 的有可能被缓存,这样也没有什么问题么?一般返回 422 400 什么的应该都是请求的参数有些问题缓存下来也没有什么意义啊
    m939594960
        11
    m939594960  
    OP
       2017-09-20 14:27:31 +08:00
    @bazingaterry #7 我觉得不是很容易出现这种和服务器状态有重叠的问题,一般 500 错误只在程序有很致命的错误 才能返回的状态码吧,正常情况下我逻辑的返回 基本都是 400 ~ 500 之间的状态码,一般情况下 nginx 或者 apache 应该不会主动返回这类的状态码吧
    lygmqkl
        12
    lygmqkl  
       2017-09-20 16:36:08 +08:00
    除了 200, 我非常喜欢使用 400,401,403,404

    建议使用 200,400,401,403,404 and 500
    lygmqkl
        13
    lygmqkl  
       2017-09-20 16:38:20 +08:00
    不过国内程序员的各种各样的怪毛病也只能见怪不怪了,
    m939594960
        14
    m939594960  
    OP
       2017-09-20 16:43:34 +08:00
    @lygmqkl #12 我这个接口也是这样的,不会用很偏僻的状态码 都是这些非常常见的。 但是看国内大厂的接口都没用这种的
    ooTwToo
        15
    ooTwToo  
       2017-09-20 17:21:38 +08:00 via iPhone
    有规范还是按规范来吧,满足不了需求还可以往 response 塞 errorinfo 呀。
    lygmqkl
        16
    lygmqkl  
       2017-09-20 17:22:09 +08:00
    @m939594960 国情而已 习惯就好了,简单的说就是 google 和 baidu 的区别

    当然国内也有很多优秀的程序员,只是你没遇到而已。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.