2008-11-12 120 views
11

我们有一个REST API,客户端通常将POST和PUT数据发送到该API。当他们这样做时,有时他们发布的数据导致我们的系统没有任何变化。 POST和PUT格式良好,但他们发送的数据与我们数据库中的数据完全相同。发生这种情况时,我发现我们正在返回400 HTTP状态。不幸的是,这意味着“错误的请求”,如“服务器由于语法格式不正确而无法理解的请求”。REST:对于被忽略的POST的正确HTTP响应代码

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

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

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

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

+0

HTTP状态302被命名为“找到”。 – mkoeller 2008-11-12 14:02:45

回答

17

我认为在这种情况下返回200 OK是完全正确的,数据被正确处理并且服务器做了它所要做的。由于服务器正确处理了数据,它应该返回一个OK状态码。它在内部忽略它的事实是或不应该是无关紧要的。

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

如果出于某种奇怪的原因(我想不出一个有效的原因),它是客户的兴趣,你有反应告诉他们。

1

从客户机查看服务器状态是相同的,如果该请求的内容是服务器上的相同与否,是吗?由于服务器事后严格保存已发送的内容,为什么服务器应对任何错误状态? 另一方面,如果请求内容与服务器已知的内容相同,客户端为什么要打扰呢?它已成功传输到服务器,因此大部分工作已完成。如果客户在这种情况下有不同的响应代码,客户会如何反应?

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

2

如果客户端在PUT之前能够知道服务器上的内容的实体标记,那么就存在与您描述的情况完全相同的If-Match标头和412 Precondition Failed响应。

+0

你的意思是`If-None-Match` – 2010-05-08 20:05:22