21

我们有一个 REST API,客户端会定期 POST 和 PUT 数据。当他们这样做时,有时他们会发布数据,这导致我们的系统没有任何变化。POST 和 PUT 格式正确,但它们发送的数据与我们数据库中的数据相同。发生这种情况时,我刚刚发现我们正在返回 400 HTTP 状态。不幸的是,这意味着“错误请求”,如“由于语法错误,服务器无法理解请求”。

显然情况并非如此,但我被告知我们将使用它,因为没有其他适当的状态代码。我们考虑过的选择:

  • 304 未修改。遗憾的是,这仅适用于 GET 请求。
  • 204 无内容。似乎很接近,但禁止实体。

其他选择似乎同样糟糕。我们可能会200 OK在返回的 XML 文档中保留相关信息,但这似乎不是很“RESTish”。REST 世界通常如何处理这个问题?

(固定未修改响应代码。感谢 Mkoeller)

4

3 回答 3

27

我认为在这种情况下返回 200 OK 是完全没问题的,数据得到了正确处理,服务器做了它必须做的事情。因为服务器正确处理了数据,所以它应该返回一个 OK 状态码。它在内部忽略它的事实是或应该是无关紧要的。

服务器对数据做了什么不应该告诉客户端,他们应该被告知请求发生了什么(处理正常,发生错误等)。

而且,如果出于某种奇怪的原因(顺便说一句,我认为这不是一个有效的原因),客户对此感兴趣,您可以回复告诉他们。

于 2008-11-12T14:02:55.620 回答
3

如果客户端能够在 PUT 之前知道服务器上内容的实体标签,那么对于您描述的情况,使用 If-Match 标头和 412 Precondition Failed 响应存在。

于 2008-11-13T02:25:35.463 回答
1

从客户端的角度来看,无论服务器上的请求内容是否相同,服务器状态都是相同的,对吧?既然服务器之后准确地保存了发送的内容,为什么服务器要以任何类型的错误状态响应?另一方面,如果请求内容与服务器已知的相同,客户端为什么要打扰呢?它已成功传输到服务器,因此完成了大部分工作。如果这种情况有不同的响应代码,客户应该如何反应?

结论:您的请求内容等于现有内容的情况并非特例。您应该使用相同的响应状态代码进行响应。那可能是 200、302 或 303。

于 2008-11-12T14:01:30.553 回答