Restful API 资源未找到应该返回什么状态码?

2019-06-27 21:20:04 +08:00
 zuoakang

需求是这样的: 查询某个用户是否存在,GET users/zhangshan

我这边使用的是 drf 框架,为了与框架统一,资源未找到返回的状态码都是 404。

与我这边对接的是 java 后台,他们觉得返回 404 会被他们 try cache,认为是请求参数有问题或者 URL 出错,程序不往下走了,而返回 200,response 为空,程序会往下走,而且知道 zhangshan 这个对象为空。

大家觉得资源不存在应该返回什么状态码呢?

12416 次点击
所在节点    程序员
93 条回复
learnshare
2019-06-27 21:23:19 +08:00
404 就是这么用的,出错需要写出错的处理逻辑,程序不走了可不行
chi1st
2019-06-27 21:29:54 +08:00
正好前两天因为这个问题和对接方争论了一下,他们认为 404 是错误,让我返回 200,对于 Restful 的规范来说确实是应该返回 404,所以我并没有去修改。但是我决定以后的接口都返回 200 了,因为公司大部分人都是按照 200 来返回的,还是遵循他们的约定比较好。

以下链接有人也对这个问题进行的讨论
https://segmentfault.com/q/1010000017048482/a-1020000017049993
k9982874
2019-06-27 21:33:04 +08:00
实际操作还是返回 200,在 response body 里再定义错误码,前端逻辑实现错误处理。
原因很简单,开发到后面你会发现那点 http error code 根本不够用。
loading
2019-06-27 21:39:00 +08:00
如果你服务器正确响应都是 200,然后 json 里面有字段,我一般是:
state:200,msg:done
state:404,msg:not found
一个是对应状态号,一个是返回的人类信息。
zqx
2019-06-27 21:40:50 +08:00
我们接口有上千个状态......restful 根本不够用啊
IvanLi127
2019-06-27 21:44:51 +08:00
404,资源未找到本来就是异常情况。
dobelee
2019-06-27 21:47:33 +08:00
个人喜好,状态码 200,协议码与应用码分离。
just1
2019-06-27 21:50:36 +08:00
@IvanLi127 #6 查询不到东西和资源未找到可不是一个概念啊,空的服务器也是 404...
kidlj
2019-06-27 21:51:21 +08:00
请求是 GET /users/zhangshan:

restful url 未找到,返回 404。如果 /users/zhangshan 未定义,返回 404.

你这个例子是 url 找到了,而且执行了 handler,只是业务资源为空,返回 200,并自定义错误码标识即可。
PDX
2019-06-27 21:54:02 +08:00
今天正好在考虑这个问题,看到你的帖子真的太好了
est
2019-06-27 22:01:12 +08:00
200

如果有客户端不小心 URL 拼错了,GET user/zhangshan

这个时候你该返回 404 呢还是返回 404 呢?

RESTful 就是代码写得少的人拍脑袋的作品。没错我说的就是 Roy Fielding。他在 2000 的 PhD 论文里发明了 RESTful 被人当成宝捡到。后来他最得意的作品在 Adobe 做的 ColdFusion。。。
billlee
2019-06-27 22:04:08 +08:00
你牛就返回 404, 对方牛就返回 200.
IvanLi127
2019-06-27 22:08:45 +08:00
@just1 我是认为 404 等于这个资源不存在,如果数据集是空的,应该返回空数组,单个资源是空的,那应该返回空资源(允许为空的情况下),资源找不到就返回 404。要是 url 压根没定义,那这是口锅了。。。
johnniang
2019-06-27 22:13:22 +08:00
不仅仅状态码需要返回 404,而且还需要返回一个统一错误返回体: {code: 404, message: "The entity was not found", data: 12345678}。

这样即符合了 RESTful 风格,也解决了状态码不够用和状态混淆的问题。
IvanLi127
2019-06-27 22:13:59 +08:00
@est 面向资源,没定义也就等于没资源。如果只看 http 状态码就想知道具体啥问题,那在响应体里写似乎也是多余了。如果是想在响应体里看,那多返回个错误信息不就好了。最后,出现这堆问题是不是 http 的锅? 手动狗头保命
zuoakang
2019-06-27 22:19:11 +08:00
@johnniang 返回体包含你说的数据,就是这个状态码是 200 还是应该是 404 ?
wu67
2019-06-27 22:22:44 +08:00
按我的理解, API 不存在 /拼错字的时候 404, 这是 http 状态.

没数据应该返回’空值’, 此时 http 应该是 200, 但你返回的 data 应该应该带 code 告知客户端状态为 404, 或者也返回 200 也行, 最后加上 msg 告知数据描述.

反正最好有一套对应的 code 和 msg, 由客户端判空进而显示 code、msg
df0618
2019-06-27 22:22:46 +08:00
@zuoakang 返回 404,body 带错误信息

不过实际上有很多项目都是返回 200 的,说白了就是谁话语权大谁说了算
est
2019-06-27 22:24:20 +08:00
@IvanLi127 而且把资源 ID 放在 URL 里的行为我是很不理解的。log 里做过滤得上正则。。。
woscaizi
2019-06-27 22:24:22 +08:00
404 资源未找到指的是 url 未找到吧。
我觉得应该用 200,然后通过自定的状态码来标示错误。

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

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

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

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

© 2021 V2EX