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

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

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

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

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

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

12423 次点击
所在节点    程序员
93 条回复
k8ser
2019-06-28 17:38:40 +08:00
drf ? 还真有人用?
Mithril
2019-06-28 17:56:09 +08:00
@ty89 我们写的代码只应对普通人类使用,神仙们就用神仙写的客户端去吧,手动狗头)
huangyuhua
2019-06-28 17:56:14 +08:00
个人感觉业务逻辑上的找不到不应该反应在 http 层面上
支持 200
xuanbg
2019-06-28 19:29:37 +08:00
对于这个情况而言,http 协议的资源是接口,接口有响应,怎么能算没找到资源呢?所以就是应该返回 200
tyrantZhao
2019-06-28 19:43:12 +08:00
业务上的错误不应该和 http 的错误混淆,所以应该在报文内设置错误码。。。另外,restful 这套规则真是复杂啊,明明很简单的东西 ,搞得这么复杂。。。不知道为什么这么多人推崇。。。
sin30
2019-06-29 10:45:41 +08:00
本来这种帖子都是懒得回复的,看懂 HTTP 协议,RESTful 建议和国外各种 api 设计的人,不会问出这种傻问题的。

但是好奇心让我看完了所有的回复,截止发送此回复时,共有 29 个回复支持使用 404,39 个回复支持用 200。

看来还是 200 党获胜啊。

这些 200 党,请问你们仔细研究过 HTTP 协议,看懂理解 RESTful 的思想,读过 Github 的 API 接口么?

都 9012 年了,还有那么多抱残守缺、不思改变的人,也真是 shame 啊。

从最开始写 API,就知道用 200,用 get post,写了这么多年不想想有没有更好的方式么?

这还只是个 200 和 404 的争论,恐怕 200 党肯定也不允许 URL 里面出现 id 参数,不允许使用 put patch delete 吧?
broadliyn
2019-06-29 18:30:44 +08:00
@sin30
得了吧你。
restful 本身只是一种设计风格,不是强制的规范标准,到你这里就变成了 200 党冥顽不灵了?
现在 graphql 出来,过几年你是不是又要拿着 graphql 来喷 restful 了?

http 接口怎么定义本身就是自己团队的约定。整天 github 挂嘴,是要把 github 当成神来供奉吗?

微软 office 团队的页面,https://www.office.com/AAAAAAAAAAAAAAA 类似这种直接 30x 跳转回首页,不用 404。
苹果未登录用户访问订单详情页返回 303 而非 403 未授权。
youtube 视频播放页输入一个错误的视频 id 直接返回 200,而且还提示视频无法播放而非视频未找到。
你挂在嘴上 github api 里,用户个人设置里的一堆 api url 带了 set/update 之类的动词,完全没有照 restful 描述的把动词放在 http 协议里。

这些大公司都有自己的 api 设计风格,按照你的 restful 标准,微软、苹果、google 都是辣鸡是么?连个 url 设计成 restful 的能力都办不到。

无知不可怕,非要拿一个标准 /设计风格把自己给圈起来,然后教育别人,跟井底之蛙没什么区别。
sin30
2019-07-01 10:59:59 +08:00
@broadliyn 首先感谢你写这么多。
sin30
2019-07-01 11:16:42 +08:00
@broadliyn 这里确实没有 RESTful 的规范标准,所以我也是说 RESTful 风格或者建议。RESTful 只是建议大家把 HTTP 标准更好的用起来。

每个公司确实会根据自己的偏好选择某些来实现,规避某些实现,这也是现实存在的,但是你只拿人家做的不好的来说,这就有点偏颇了。

对于 RESTful 的基本共识大家还是有的,各种开发框架也把这些共识固化下来给大家用了,可以参考 SpringMVC。

只要是有利于接口表达、使用者方便的好技术、好建议我都支持。

请看清楚本贴的题目,人家问的是 RESTful API,你可以随便写 http 接口,但请不要说自己是 RESTful。

另外既然你知道 RESTful 别家公司用的那么烂,有勇气晒一下自己发明的接口规范么?

看看你不用 Accept 头是怎么做 Content Negotiation 的,不用 Accept-Language 是怎么做多语言国际化的。
sin30
2019-07-01 11:23:58 +08:00
@broadliyn 在你发出自己发明的接口规范之前,我不会对你的回复进行任何无意义的评论。
sin30
2019-07-01 11:26:10 +08:00
@broadliyn 我们可以针对你发明的接口规范来和 RESTful 建议进行一些有意义的讨论,来评判到底谁的设计规范更好用,更规范。
WilliamYang
2019-07-01 12:27:37 +08:00
@broadliyn 我觉得你好像把页面和 api 的路由混为一谈了,在这个主题下,举例不太恰当
broadliyn
2019-07-01 14:36:25 +08:00
@WilliamYang 哦?是吗?你把返回页面这么分 html 和 api json 那说明你不懂 restful 了。
restful 返回的是资源,资源不分 html 还是 json 或者还是其他。
资源有多种展示格式,html 页面是一种、application/json 也是一种、还有很多 xml、影音视频……。服务端根据客户端 accept 头选择返回需要的格式。

主题讨论的是 restful url 以及返回的 http status 404 相关的,我为什么不能用普通 html 举例?

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

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

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

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

© 2021 V2EX