RESTful api 如果数据不存在时应该返回200还是404?

zxr615
  • 28

场景获取用户聊天信息 : GET /messages?user=1
如果该用户没有聊天记录,那返回数据时应该返回200的空值还是404不存在?

200成功
{
    "status": 200   #HTTP状态码
    "message": "ok"
    "data" : []
}
404错误
{
    "status":404    #HTTP状态码
    "message":"数据不存在"
    "error_code":1000
}

2018/12/4更新:
参考了豆瓣和GitHub的似乎这两种都有用
豆瓣:https://api.douban.com/v2/boo...
获取不到图书时返回404

clipboard.png

GitHub:https://api.github.com/search...:Ruan Yifeng3

clipboard.png

回复
阅读 7.1k
11 个回答
littleLyon
  • 7.8k
✓ 已被采纳

这个因使用者的偏好而异吧,有的是通过响应体的格式来约束的,有的是通过 http status code + 响应体来约束的。

因为你有提及 rest,所以用 404 其实没什么问题的,rest 本来就有意将 http method 和 http status 与资源关联起来,别的答案有提及返回 404 无法分清接口层面和资源层面的不存在问题,这个 404 状态的请求也是可以回传 body 的呀,有什么分不清的呢?还有说涉及安全问题的更远了吧,4xx 是指 Client Error,是不会直接返回错误堆栈信息的,如果要说用户体验的话,会影响一些,不过可以通过自定义 4xx 的响应页面来改善。

使用 200 的话,也没有什么绝对意义上的错误,只是一种习惯而已,据我所知,腾讯大部分接口均是按照 200 这种消息格式来传达的。所以因地制宜吧,看是偏向于使用哪种,但是切记不要混用,容易产生混乱。

另外再说一点,如果前端一直期望于返回 200 状态的接口,而忽视错误处理的话,其实并没有什么好处。

返回200。返回内容里放约定的内部代码code和msg信息。否则调用时怎么判断是调用的接口不存在,还是请求的资源不存在?不给200的话前端如果用Ajax会走到error或者fail回调上,不会正常执行success回调,前端会拿刀追杀你的。。。

沉溺时光
  • 1
新手上路,请多包涵

先看百度 -- > 404状态码:所请求的页面不存在或已被删除!
根据百度,我们可以思考一个问题,页面是什么?
页面肯定是通过后端的数据渲染出来的,数据即代表资源。
所以页面是资源的载体。
还有什么是资源?文件、图片、视频、音频甚至一段字符串都可以代表资源。
资源也肯定不是一张表,是实实在在的数据。

在看看什么是restful风格的api :首先,restful风格的api的uri就是代表资源 ,采用动词 + 宾语 , 动词代表GET(获取)/POST(新增)/PUT(全量修改)/DELETE(删除)/PATCH(部分修改)等等,宾语就是资源。比如:POST /usrs :代表新增一个用户 ,GET /users:获取所有用户

而状态码即代表我们动宾后结果的状态。
404在res*tful中代表:所请求的资源不存在,或不可用。
那么我们的rest的api结果为null返回404难道有错吗?
至于有些人说前端接受不了404,我觉得那是前端问题,不是后端问题。
还有人说封装成自定义code,那你还用什么restful风格api,直接自定义code和message处理多方便。
但是目前很多用户对404的理解不够深,一看到404就觉得有问题,所以后端人员表示很无奈,出于对用户使用的友好,不得不在后端把404改成200,或者前端去特殊处理一下404。*

404(未找到),『未找到』代表的不是没有找到数据,而是代表服务器找不到请求的链接、网页或是文件。

最好是返回200的空值。因为如果传404会出现 分不清是找不到接口 还是 该用户没有聊天记录 的情况。

半夏
  • 123

肯定返回200啊,你返回404前端有可能误以为是接口问题

建议不要返回404,因为把HTTP 这些状态暴露给用户会有安全性问题,就等于告诉用户这次请求会发生什么了。可以都返回200.或者 内部统一定义一套,比如:返回10000 代表密码错误等

严格来说,应该是放在HTTP code,但是实践中还是 HTTP code 200,放在消息体的居多。

200,404的意思是接口不存在

就像你取邮件虽然没有来信 但是邮箱地址是存在的啊不能用404啊

gh6497
  • 1
新手上路,请多包涵

当然返回404,要不然还谈什么restful

宣传栏