我正在构建一个对名词Foo
进行操作的API。当调用者使用POST请求创建Foo
的实例时,他们需要向第二个名词Bar
提供ID。如果他们提供的ID类型正确,但没有Bar
具有该ID,那么404是否是正确的回复?
答案 0 :(得分:5)
我认为这取决于ID是否在URL中。 URL是资源的地址,如果ID在URL中并且不存在具有此ID的项目,或者您根本不提供该项,则URL无效,因此无法找到资源,因此那是一个404。
但是,如果URL中的ID 不是,而是来自POST请求的数据,并且URL是资源的有效地址,则应返回400 Bad Request。 / p>
答案 1 :(得分:3)
我建议使用HTTP 400(错误请求)。
见http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1。可以将400解释为客户端未正确形成请求的一般指示。
还可以提出一个返回500响应的案例。如果客户端认为Bar引用有效,则服务器无法处理此请求可能会被视为异常。例如,如果引用有效,但是另一个客户端删除它,则可能发生这种情况。在这种情况下,第一个客户端没有做错任何事情。
答案 2 :(得分:1)
简而言之:不。您的API应该是“用户友好的”,这意味着,如果出现错误,它应该以用户可以找出问题所在的方式返回它。返回404就像是说找不到服务并不是真的。响应应该是403 - 因为可能是客户端尝试接近的ID的资源属于不同的客户端!
此外,响应应该包含一个错误消息/代码(在正文中),客户可以对其进行解析和分析。
答案 3 :(得分:0)
这有点灰色地带。
尽管 500 响应代码因其更广泛的上下文看起来很合适,但也可以考虑 404 响应代码。
我不确定 404 代码的原因是您提出请求的主要目的。发送请求以创建新资源。它不是用于检索现有资源。尽管根本原因是“未找到”资源,但请求的目的是针对新实体。获取 404 响应代码可能会导致客户端产生歧义。因此,具有良好解释的 500 看起来是更好的选择。
我可以明确指出,400 响应代码在这种情况下不方便,因为请求语法没有任何问题。
MDN Web Docs - HTTP response status codes 中的以下定义可能有助于做出决定。
400 错误请求:
<块引用>由于语法无效,服务器无法理解请求。
404 未找到:
<块引用>服务器找不到请求的资源。在浏览器中,这个 表示无法识别 URL。在 API 中,这也可能意味着 端点有效但资源本身不存在。服务器 也可以发送这个响应而不是 403 来隐藏一个 来自未经授权的客户端的资源。这个响应代码可能是 最著名的一个,因为它经常出现在网络上。
500 内部服务器错误:
<块引用>服务器遇到了不知道如何处理的情况。
答案 4 :(得分:0)
如果服务器 100% 确定对 Bar 的引用可能不正确(该 ID 是完全无效的格式或不可能存在),那么这是一个直接的 400 错误请求。< /p>
如果服务器允许某人在不允许删除的情况下删除该栏(Foo 应该随之删除),那么这是一个 500 内部服务器错误。
这里客户端正在创建一个带有对 Bar 的悬空引用的 Foo(因为它是一个 POST,如果它正在更新一个 Foo,它将是一个 PUT)。客户端以某种方式获得了对所引用 Bar 的引用,如果再次尝试,大概可以找到合适的现有 Bar。在这种情况下,服务器返回 409 Conflict 以表示该请求虽然有效,但与服务器的状态冲突,需要删除或重建,以使其与服务器的状态一致。 409 响应应指明问题是引用的 Bar 不存在。