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

接口到底完全遵守 restful,用 HTTP Status 来返回状态码好,还是用 json 返回 code 更好

  •  
  •   m939594960 · 2016-12-02 14:22:08 +08:00 · 11152 次点击
    这是一个创建于 2898 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人不是很喜欢用 HTTP Status 来返回状态码。 有几点原因:

    1.JS 判断起状态码来相对还是比较麻烦的

    2.HTTP Status 主要几个状态码还行,其他的状态码感觉并不是很清晰

    3.经常遇到网络有问题的时候返回 200 但是 body 里是空值的时候


    而且个人感觉用 HTTP Status 来返回状态码 并没有感觉到什么方便 /舒服的地方

    不知道大家怎么看呢,应该用哪种方式呢?

    18 条回复    2016-12-03 00:27:23 +08:00
    abelyao
        1
    abelyao  
       2016-12-02 14:49:35 +08:00 via iPhone   ❤️ 2
    这一两个月以来 V2 上至少两个帖子讨论这个问题了
    m939594960
        2
    m939594960  
    OP
       2016-12-02 14:50:42 +08:00
    @abelyao 哈哈 但是都没有很明确的结果,还是想来问问。
    abelyao
        3
    abelyao  
       2016-12-02 14:52:45 +08:00 via iPhone
    @m939594960 有什么区别,照样还是各抒己见
    hellommd
        4
    hellommd  
       2016-12-02 14:52:52 +08:00
    这个本来就是没有结果的问题,符合内部使用要求即可。
    wdrsam
        5
    wdrsam  
       2016-12-02 15:13:24 +08:00
    各有各的要求。反正我们公司的前端经常抱怨我们的 api ,明明这个动作的(例如更新一个字段)执行失败了,你就直接 message 那返回 false ,为啥还个字段写个 false , message 那是 true ?我说,那个 true 证明你请求成功了。。 2 个东西表达意思不一样呢
    EXE
        6
    EXE  
       2016-12-02 15:20:14 +08:00 via Android   ❤️ 3
    我一直都是使用的后者,天朝这种网络环境下,返回个非 200 的响应指不定运营商给你劫持到什么页面
    kernelreload
        7
    kernelreload  
       2016-12-02 15:23:06 +08:00 via Android   ❤️ 1
    有的时候明明错误了,我们伟大的天朝运营商还是会给你返回完美 200 还附送广告一幅。
    jarlyyn
        8
    jarlyyn  
       2016-12-02 15:24:55 +08:00
    1.如果用 jquery,用状态码判断是最简单的。直接 ajaxsetup 。
    2.目前的网络环境,已经不用考虑劫持了。直接上 Https 吧。
    Felldeadbird
        9
    Felldeadbird  
       2016-12-02 16:03:27 +08:00
    我觉得你应该和对接的人说,而不是到网上问。
    即使大家给了你建议,但内部得看法和大家的建议不一致时怎么办呢?
    learnshare
        10
    learnshare  
       2016-12-02 16:09:14 +08:00
    状态码有其统一的定义,自定义错误可以增加更多可用信息

    @EXE
    @jarlyyn
    不知道这个劫持的问题是谁给的经验,什么时候、什么情况下得出的。真正遇到的有多少呢?
    baiyi
        11
    baiyi  
       2016-12-02 16:14:40 +08:00
    感觉这个问题要比得上'php 是最好的语言'了

    我会用 HTTP 状态吗返回

    @learnshare 在好多这个问题的帖子里都看到你了
    baiyi
        12
    baiyi  
       2016-12-02 16:15:14 +08:00
    @baiyi 吗->码
    learnshare
        13
    learnshare  
       2016-12-02 16:34:36 +08:00   ❤️ 1
    @baiyi 都是闲逛的人 >_<
    phpcxy
        14
    phpcxy  
       2016-12-02 16:38:08 +08:00
    都没所谓,看调用接口的人需求!
    xhat
        15
    xhat  
       2016-12-02 16:52:42 +08:00   ❤️ 2
    一个严肃的工程思维不应该用状态码

    状态码在本质上不属于业务逻辑范畴
    不能把服务器响应状态和业务逻辑返回值混为一谈

    举个简单例子:
    在发起支付时,要判断支付的几种状态:提交失败、提交成功但支付失败、提交成功且支付成功。
    只用 200 显然不能解决这种业务逻辑。如果为每个动作赋予一个状态码苟且解决,就完全失去状态码的意义了。

    这或许就是程序员和工程师的区别,之一吧
    jarlyyn
        16
    jarlyyn  
       2016-12-02 17:04:02 +08:00
    @learnshare

    我遇到过。之前很厉害,现在好了很多。
    而且现在应该也只劫持 404/403 了。
    jarlyyn
        17
    jarlyyn  
       2016-12-02 17:08:01 +08:00   ❤️ 1
    @xhat

    个人理解,要以严肃来说,必须用状态码。

    状态码表示的是 http 状态的错误。

    典型如 404/403/401

    4 系列错误本身就是指客户端错误,客户端应该确认正确后再重新发送。

    返回的错误码表示业务的错误。

    最典型的区别,这会影响到 Http 服务器,浏览器 /客户端的缓存逻辑。
    shsf4
        18
    shsf4  
       2016-12-03 00:27:23 +08:00   ❤️ 1
    应该结合两种来使用~
    使用常见的状态码,至少 200 , 404 , 301 这些都要用到吧
    业务类型的 code 也需要,你看微信接口那么多种类型的 code
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2848 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.