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

2021-04-15 10:47:19 +08:00
 codeismylife

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

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

URL 类似:

/user?id=1

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

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

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

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

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

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

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

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

比如说 AABBCC 这样六位数的错误代码,可以将错误明确指向到 AA 系统,BB 模块,CC 错误
wakzz
2021-04-15 17:05:12 +08:00
RESTful 范式对于简单的场景还行,业务错误码稍微复杂点,就捉襟见肘了。
cxe2v
2021-04-15 17:10:16 +08:00
一个实际问题,RESTful 如何支持复杂的业务返回码?楼主有成熟可靠的设计方案吗?
codeismylife
2021-04-16 13:44:33 +08:00
@cxe2v 我其实也不是严格遵守 RESTful 的,当业务较为复杂的时候,我会在 4XX 和 5XX 情况下,返回值里塞 CODE 字段,里面就是错误业务类错误码。200 情况下不再进行包装。业务不复杂的时候,严格遵守 RESTful 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/770775

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX