Rest 如果对其他实体的引用失败,POST请求是否应该返回404?

Rest 如果对其他实体的引用失败,POST请求是否应该返回404?,rest,restapi,Rest,Restapi,我正在构建一个对名词Foo进行操作的API。当调用方通过POST请求创建Foo的实例时,他们需要向第二个名词Bar提供ID。如果他们提供的ID类型正确,但没有带有该ID的条,404是正确的响应吗?我建议使用HTTP 400(错误请求) 看。可以将400解释为客户端未正确形成请求的一般指示 你也可以提出理由,要求回复500条回复。如果客户端认为Bar引用是有效的,那么服务器未能处理此请求可能被视为异常。例如,如果引用有效,但另一个客户机删除它,则可能会发生这种情况。在这种情况下,第一个客户端没有做

我正在构建一个对名词
Foo
进行操作的API。当调用方通过POST请求创建
Foo
的实例时,他们需要向第二个名词
Bar
提供ID。如果他们提供的ID类型正确,但没有带有该ID的
,404是正确的响应吗?

我建议使用HTTP 400(错误请求)

看。可以将400解释为客户端未正确形成请求的一般指示


你也可以提出理由,要求回复500条回复。如果客户端认为Bar引用是有效的,那么服务器未能处理此请求可能被视为异常。例如,如果引用有效,但另一个客户机删除它,则可能会发生这种情况。在这种情况下,第一个客户端没有做错任何事情。

简言之:没有。您的API应该是“用户友好的”,这意味着,如果出现错误,它应该以用户能够找出问题所在的方式返回。返回404就像说找不到服务,这是不正确的。响应应该是-因为可能是客户端试图接近的ID为的资源属于不同的客户端


此外,响应应该包含一条错误消息/代码(在正文中),客户端可以对其进行解析和分析。

我认为这取决于ID是否在URL中。URL是资源的地址,如果ID在URL中,并且不存在具有此ID的项目,或者您根本不提供该ID,则URL无效,因此找不到资源,因此为404


但是,如果ID不是URL中的,而是来自POST请求的数据中的,并且URL是资源的有效地址,那么应该返回400个错误请求。

这是一个有点灰色的区域

尽管500响应代码因其更广泛的上下文而看起来很适合,但也可以考虑404响应代码

我不确定404代码的原因是您请求的主要目的。发送请求以创建新资源。它不用于检索现有资源。虽然根本原因是“找不到”资源,但请求的目的是创建一个新实体。获取404响应代码可能会对客户端造成歧义。因此,具有良好解释的500看起来是更好的选择

我可以清楚地指出,对于这种情况,400响应代码并不方便,因为请求语法没有任何错误

以下来自的定义可能有助于做出决策

400错误请求:

由于语法无效,服务器无法理解该请求

404未找到:

服务器找不到请求的资源。在浏览器中,此 表示无法识别URL。在API中,这也意味着 终结点有效,但资源本身不存在。服务器 也可以发送此响应而不是403,以隐藏 来自未授权客户端的资源。此响应代码可能是 最著名的一个是因为它经常出现在网络上

500内部服务器错误:

服务器遇到不知道如何处理的情况

  • 4xx在标准中被称为“客户端错误”
  • 5xx的标题为“服务器错误”
如果服务器100%确定对Bar的引用不正确(该id的格式完全无效或不可能存在),则这是一个直接错误的请求

如果服务器允许某人删除不允许删除的条(Foo应该随之删除),那么这是一个500内部服务器错误


在这里,客户机正在创建一个Foo,其中包含对一个条的悬空引用(因为它是一个POST,如果它正在更新一个Foo,那么它将是一个PUT)。客户端以某种方式获得了对被引用条的引用,并且如果重试,可能会找到适当的现有条。在这种情况下,服务器返回409 Conflict,以表示请求在有效时与服务器的状态冲突,并且需要删除或重构以使其与服务器的状态一致。409响应应该指定问题在于引用的条不存在。

400如果请求语法正确,则感觉是一个奇怪的选择:调用者为
id
提供了正确的类型,但值没有正确解析。422/不可处理实体是否已被充分接受以供使用?@ehdv 422表示语义错误。看起来403会更合适。在你的问题中,你会说:“如果他们提供的ID类型正确,但没有条…”。这听起来是个糟糕的要求。客户端引用的是一个不存在的服务器实体。您可能需要返回500响应。如果客户端认为Bar引用是有效的,那么服务器未能处理此请求可能被视为异常。例如,如果引用有效,但另一个客户机删除它,则可能会发生这种情况。在这种情况下,第一个客户机没有做错任何事情。只有当处理是由于服务器本身的错误配置(即内部服务器错误)造成的,而不是由于客户机的错误,才有理由认为500响应是合适的。如果客户端发送的数据不正确,则需要400系列中的响应代码。只有当处理是由于服务器本身的错误配置(即,内部服务器错误)造成的,而不是由于客户端的错误,才有理由认为500响应是适当的。如果客户端发送的数据不正确,则需要400系列中的响应代码