有严格遵守 RESTful 范式的朋友吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeismylife
V2EX    问与答

有严格遵守 RESTful 范式的朋友吗?

  •  
  •   codeismylife 2021-04-15 10:47:19 +08:00 2645 次点击
    这是一个创建于 1727 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很多人,接口设计都是纯 200,然后 BODY 类似:

    { "code":0, "message":"", "data":null 

    URL 类似:

    /user?id=1 

    这样。 刚开始我也试图遵守 RESTful 范式的,但是我身边很多人都喜欢包这么一层,然后什么请求都响应 200,我也就这么做了。 非常好奇为啥大家喜欢这么包一层,是因为业务复杂 http status 不够用才用 code 吗? 话说这种方案,我实在没想出来有啥大的优点呢……

    17 条回复    2021-04-16 13:44:33 +08:00
    mhycy
        1
    mhycy  
       2021-04-15 10:48:46 +08:00
    非 200 状态码可能会被浏览器 or 网关拦截
    kkkkkrua
        2
    kkkkkrua  
       2021-04-15 11:00:48 +08:00
    可以搞,但是不要照本宣科,有些复杂的场景 RESTful 也没办法表示其意思
    baiyi
        3
    baiyi  
       2021-04-15 11:00:55 +08:00   1
    RESTful 没有一个标准范式,只有各大厂商的实践规范,所以也谈不上遵守。

    在成功的响应中加 code 和 message 字段在我看在是无意义行为,只是为了方便调用者使用统一结构进行解析的偷懒行为。
    但 data 字段在某些情况是需要在在成功的响应中返回的,因为 oc 不支持解析数组形式的 json 数据...不知道现在是否支持了,除此之外也没有什么必要加 data 字段。

    至于 http status code 是否能够代表业务状态,在我看来是不能代表的,它最好只代表 http 请求的状态。因为在客户端提交请求的过程中,各个组件(代理、网关等)都是根据 http status code 来对请求进行处理。

    在响应错误时,如果有额外的 message 字段来对错误进行描述,或者增加 code 字段来代表某一类 message,这都是业务需要,与 RESTful 无关。
    abersheeran
        4
    abersheeran  
       2021-04-15 11:16:20 +08:00
    可能是因为以前的项目都是这么封装的,有许多现成的代码。没有影响业务的情况下,就不改了。
    feeeei
        5
    feeeei  
       2021-04-15 11:31:04 +08:00   1
    非 200 被拦截这一点,现在满大街都是 HTTPS 了,已经没有这个问题了

    清一色都返回 200,问题是比较大的

    之前帮前端 Debug 就遇到过,打开一个页面发了十几个 request,清一色返回都是 200,但是页面提示报错,还得一个个请求点进去看 response 才知道具体是哪个接口的问题。

    然后还有问题就是,如果清一色都是反 200,在一些日志收集服务上,看大盘统计反馈不出业务的服务质量,因为都是 200 状态码。如果改统计规则,改成读取 body 内的 code 来做质量统计,json 又做不到强制格式约束,做不到 100%的格式约束。
    IvanLi127
        7
    IvanLi127  
       2021-04-15 12:40:40 +08:00 via Android
    自己的项目就严格遵守,公司的只能跟着大家的写法写了。遵守起来是可行的,不过有些地方不变通,其实也不太好。
    响应包一层就很无语了,异常处理流程能是正常流程一样么,包一层也做不到复用,还浪费
    wangkun025
        8
    wangkun025  
       2021-04-15 12:45:24 +08:00
    用的是 Ruby on Rails,写 API 的时候,尽量使用状态码。但有的同事喜欢在 body 里写状态码,然后全部用 post 。
    lsdvincent
        9
    lsdvincent  
       2021-04-15 13:29:49 +08:00
    还真有,但是有时候会被说有点繁琐,太严格了
    timethinker
        10
    timethinker  
       2021-04-15 13:52:21 +08:00   2
    的确是有很多公司用统一的包装体来返回所有的数据,我个人认为这是没有必要的。
    首先,在成功的情况下,code 和 message 是没有意义的,前端也只会取里面的 body 字段。
    其次,在失败的情况下,body 字段一般都为 null 。
    就先前面几位说的,如果在失败的情况下不使用 HTTP 4XX 状态码,而全部使用 200,对外部的监控 /采集系统来说也确实不太标准。
    所以这个包装体在成功或者失败的情况下都存在冗余字段。
    我们目前对于成功的请求( 2XX ),只返回数据本身,不同的接口直接返回不同的数据。
    失败的情况下才会返回统一的错误数据结构,比如 code 、message 。
    FrankFang128
        11
    FrankFang128  
       2021-04-15 14:22:54 +08:00
    他们在老一辈的恐吓放弃 status code,
    现在又来恐吓你
    vibbow
        12
    vibbow  
       2021-04-15 17:02:17 +08:00
    HTTP status code -> Load Balancer 是否成功访问到了后端服务器
    Body status code -> 应用层是否处理成功
    yyzcl
        13
    yyzcl  
       2021-04-15 17:04:44 +08:00 via iPhone
    自己的项目遵守。公司的随大流
    vibbow
        14
    vibbow  
       2021-04-15 17:04:56 +08:00
    其次就是应用层可以定义较为复杂的错误代码信息

    比如说 AABBCC这样六位数的错误代码,可以将错误明确指向到 AA 系统,BB 模块,CC 错误
    wakzz
        15
    wakzz  
       2021-04-15 17:05:12 +08:00
    RESTful 范式对于简单的场景还行,业务错误码稍微复杂点,就捉襟见肘了。
    cxe2v
        16
    cxe2v  
       2021-04-15 17:10:16 +08:00
    一个实际问题,RESTful 如何支持复杂的业务返回码?楼主有成熟可靠的设计方案吗?
    codeismylife
        17
    codeismylife  
    OP
       2021-04-16 13:44:33 +08:00
    @cxe2v 我其实也不是严格遵守 RESTful 的,当业务较为复杂的时候,我会在 4XX 和 5XX 情况下,返回值里塞 CODE 字段,里面就是错误业务类错误码。200 情况下不再进行包装。业务不复杂的时候,严格遵守 RESTful 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     961 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 20:47 PVG 04:47 LAX 12:47 JFK 15:47
    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