REST:正确的HTTP响应代码,用于忽略的POST

时间:2008-11-12 13:43:04

标签: http rest http-headers

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

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

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

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

(修正未修改的响应代码。感谢Mkoeller)

3 个答案:

答案 0 :(得分:20)

我认为在这种情况下返回200 OK是完全正常的,数据已正确处理并且服务器完成了必要的操作。由于服务器正确处理了数据,因此应返回OK状态代码。它在内部忽略它的事实是或应该是无关紧要的。

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

如果由于一些奇怪的原因(我不能认为是有效的那个,顺便说一句),客户感兴趣,你有回应告诉他们。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

从客户端视图看,如果服务器上的请求内容相同,服务器状态是否相同,对吧?由于服务器之后完全保留了已发送的内容,为什么服务器应该以任何类型的错误状态进行响应? 另一方面,如果请求内容与服务器已知的内容相同,为什么客户端会烦恼?它已成功转移到服务器,因此大部分工作已完成。如果针对这种情况有不同的响应代码,客户应该如何做出反应?

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