在静态中,如何在语义上区分有效URL返回的404和有效URL指向不存在的资源所返回的404?

问题描述

所以我实际上并不喜欢RESTful API,但是在我受聘的地方,它们仍然使用很多。

所以我想出了一个假想案例,显示了我的困惑:

假设您有一个端点GET v1/users/{id}

现在想象一下,目前只有一个用户,其ID为1

我该如何区分返回的404

GET /v1/users/0

和返回的那个

GET /v1/usres/1? (故意打错)

解决方法

我该如何区分返回的404

响应正文,请参见RFC 7231

除响应HEAD请求外,服务器应发送表示形式,其中包含错误情况的说明以及错误情况是暂时的还是永久的情况。

GET /v1/users/0

404 Not Found
Content-Type: text/plain

There is currently no user 0 in the database
GET /v1/usres/1

404 Not Found
Content-Type: text/plain

usres? What are you talking about?

Did you mean? 
 * /v1/users/1
 * /v1/ursae/1 

从通用组件的角度(例如浏览器或缓存)来看,这两种情况绝对没有区别。

但是对于客户(正在查看网页的人,或者知道您资源语义的机器组件),希望将差异传达给他们。

对于人类来说,这意味着将解释问题的文本返回到响应正文中(例如,在html页面中)。

对于一台机器,这意味着放入您的模式定义的提示,以便机器可以区分这两种情况。