4

我将通过举一个例子来解释我的疑问。

假设我正在POSTstudent资源设计一个端点,并且作为 POST 端点的一部分,我希望teacher传递一个 uuid(除了其他详细信息),这是一个必填字段。这样我就可以将studentteacher. 现在,如果我的数据库中不存在teacher给定的资源,uuid那么我应该抛出什么:

400 (Bad request)
404 (Not found).

我认为400这将是正确的事情。

如果我有如下请求,那么我会抛出 404 之类的

GET /xyy/teachers/{uuid of a teacher}.

如果我错了,请纠正我。谢谢。

4

2 回答 2

1

我更喜欢404,因为您请求的资源不可用。如果你看看他们说的 w3.org 规范400

由于语法错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。

由于您的语法没有格式错误,对我来说这听起来像是经典的 404。

于 2015-03-29T10:14:15.490 回答
0

这实际上是一个很好的问题。正如其他人所指出的,400(Bad Request) 和404(Not Found) 似乎都不适合这种情况。

  • HTTP 400(Bad Request)往往被用来表示错误的语法格式错误的请求,这被视为客户端错误。在您的情况下,请求是完全有效的,并且符合服务器的期望。
  • 404当目标资源不存在或服务器不想透露该资源存在时,通常会返回HTTP (未找到) 。在您的场景中,有人可能会争辩说“目标资源”( a student)不是问题的原因,因此 a404可能在语义上令人困惑。

作为替代方案,让我建议一个422(不可处理实体)响应,它是 WebDAV 扩展的一部分。它旨在涵盖服务器...

[...] 理解请求实体的内容类型,请求实体的语法是正确的,但它无法处理包含的指令。

这看起来非常适合您的问题。

于 2021-02-19T12:47:51.547 回答