接口到底完全遵守 restful,用 HTTP Status 来返回状态码好,还是用 json 返回 code 更好 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
m939594960
V2EX    问与答

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

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

    个人不是很喜欢用 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     Solana     2628 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:45 PVG 22:45 LAX 07:45 JFK 10:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86