REST API 404:错误的URI或缺less资源?

我正在构build一个REST API,但是我遇到了一个问题。

看来在devise一个REST API中被接受的做法是,如果请求的资源不存在,则返回一个404。

但是,对我来说,这增加了不必要的含糊之处。 传统上,HTTP 404与一个错误的URI相关联。 所以实际上我们是这样说的: “要么你到了正确的地方,而是那个特定的logging不存在, 或者互联网上没有这样的位置!我真的不确定哪一个……”

考虑以下的URI:
http://mywebsite/api/user/13

如果我得到404回来,是因为用户13不存在? 或者是因为我的url应该是:
http://mywebsite/restapi/user/13

在过去,如果logging不存在,我刚刚返回了带有HTTP 200 OK响应代码的NULL结果。 这很简单,在我看来很干净,即使它不一定被接受的做法。 但有没有更好的方法来做到这一点?

404只是HTTP响应代码。 最重要的是,您可以为响应正文和/或其他标题提供开发人员将看到的更有意义的错误消息。

如果资源不存在,请使用404 不要用空的身体返回200

这在编程中类似于undefined vs空string(例如"" )。 虽然非常相似,但是确实有区别。

404意味着这个URI没有任何东西(就像编程中的一个未定义的variables)。 用一个空的体来返回200意味着在那里存在某种东西,而现在只是空的东西(就像编程中的空string)。

404并不意味着它是一个“坏URI”。 有一些特殊的HTTP代码用于URI错误(例如414 Request-URI Too Long )。

与大多数情况一样,“取决于”。 但对我来说,你的做法并不差,不会违背HTTP规范本身 。 不过,让我们澄清一些事情。

首先,URI应该是不透明的。 即使对人不透明,对机器也是不透明的。 换句话说, http://mywebsite/api/user/13http://mywebsite/restapi/user/13http://mywebsite/api/user/13http://mywebsite/api/user/14之间的区别是一样的http://mywebsite/api/user/14 ie不一样是不一样的时期。 所以一个404将完全适用于http://mywebsite/api/user/14 (如果没有这样的用户),但不一定是唯一适当的响应。

您也可以返回一个空的200响应,或者更明确地返回一个204(无内容)响应。 这会传达给客户一些其他的东西。 这意味着由http://mywebsite/api/user/14标识的资源没有内容,或者本质上没有任何内容。 这确实意味着有这样的资源。 然而,这并不一定意味着你声称有一些用户坚持在ID为14的数据存储中。这是你的私人关心,而不是客户提出请求的顾虑。 所以,如果以这种方式为您的资源build模是有意义的,请继续。

给您的客户提供一些信息,这会使他们更容易猜测合法的URI,这有一些安全隐患。 回想200而不是404可能会给客户一个线索,至lesshttp://mywebsite/api/user部分是正确的。 恶意的客户端可能会继续尝试不同的整数。 但对我来说,恶意客户端无论如何都可以猜测http://mywebsite/api/user部分。 更好的补救办法是使用UUID。 即http://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66http://mywebsite/api/user/14更好。 这样做,你可以使用你的技术,返回200的没有多less。

404 Not Found技术上意味着uri当前没有映射到资源。 在你的例子中,我解释了一个请求到http://mywebsite/api/user/13 ,返回一个404来暗示这个url 从未映射到资源。 对于客户来说,这应该是谈话的结束。

为了解决模棱两可的问题,您可以通过提供其他响应代码来增强您的API。 例如,假设您希望允许客户端发送GET请求url http://mywebsite/api/user/13http://mywebsite/restapi/user/13传达客户端应该使用规范URL http://mywebsite/restapi/user/13 。 在这种情况下,您可能需要考虑通过返回“永久移动301”来发出永久redirect,并在响应的“ 位置”标题中提供规范url。 这告诉客户端,为了将来的请求,他们应该使用规范的URL。

这篇老,但优秀的文章… http://www.infoq.com/articles/webber-rest-workflow说这个;…

404没有find – 服务太懒惰(或安全)给我们一个真正的原因,为什么我们的请求失败,但无论原因,我们需要处理它。

所以实质上,这听起来像答案可能取决于如何形成请求。

如果所请求的资源按照对http://mywebsite/restapi/user/13的请求形成URI的一部分,并且用户13不存在,则404可能是适当且直观的,因为URI代表不存在用户/实体/文件/等。 对于使用GUID http://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66和上面的api / restapi参数的更安全的技术,这同样适用。

但是,如果所请求的资源ID包含在请求标头[包含您自己的示例]中,或者确实在URI中作为参数,例如http://mywebsite/restapi/user/?UID=13那么URI仍然会是正确的(因为USER的概念在http://mywebsite/restapi/user/退出); 因此可以合理预期响应是200(具有适当冗长的消息),因为被称为13的特定用户不存在但是URI确实存在。 这样我们说URI是好的,但对数据的请求没有内容。

就个人而言,200还是觉得不对(虽然我以前曾经说过)。 例如,一个200响应代码(没有详细的响应)可能会导致在发送不正确的ID时不能调查问题。

一个更好的方法是发送204 - No Content响应。 这符合w3c的描述*服务器已经完成了请求,但不需要返回实体主体,并且可能想要返回更新后的元信息。* 1在我看来,混淆是由维基百科条目引起的, – 服务器成功处理了请求,但没有返回任何内容。 通常用作对成功删除请求的响应 最后一句话是非常有争议的。 考虑没有这句话的情况,解决办法很简单 – 只要发送一个204,如果实体不存在。 甚至有一个参数返回204而不是404,请求已被处理,没有内容已被返回! 请注意,虽然204不允许回应内容

来源

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 1. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

统一资源标识符是指向资源的唯一指针。 forms不佳的URI不指向资源,因此在其上执行GET将不会返回资源。 404意味着服务器没有find任何匹配的请求的URI。 如果你把错误的URI或错误的URI,这是你的问题,你没有得到一个资源,无论是HTML页面或IMG的原因。