代码之家  ›  专栏  ›  技术社区  ›  Ovid

rest:为忽略的日志更正HTTP响应代码

  •  14
  • Ovid  · 技术社区  · 16 年前

    我们有一个RESTAPI,客户机会定期发布数据并将其放入其中。当他们这样做时,有时他们会发布数据,这不会导致我们的系统发生变化。帖子和推文格式良好,但它们发送的数据与我们数据库中的数据相同。当发生这种情况时,我刚刚发现我们返回的是400 HTTP状态。不幸的是,这意味着“错误的请求”,因为“由于语法错误,服务器无法理解请求”。

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

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

    其他选择似乎同样糟糕。我们可以一起去 200 OK 并在返回的XML文档中包含相关信息,但这似乎不是很“重新建立”。其他国家通常如何处理这个问题?

    (已修复未修改的响应代码。谢谢Mkoeller)

    3 回复  |  直到 15 年前
        1
  •  20
  •   Vinko Vrsalovic    16 年前

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

    服务器对数据所做的操作不应该告诉客户机,应该告诉他们请求发生了什么(处理正常、发生错误等)。

    如果出于某种奇怪的原因(我想不出一个有效的理由,顺便说一句),这是客户感兴趣的,你有回应告诉他们。

        2
  •  3
  •   Justin Sheehy    16 年前

    如果客户机能够在放置内容之前知道服务器上内容的实体标记,那么使用if-match头和412 precondition failed response来精确描述您所描述的情况。

        3
  •  1
  •   mkoeller    16 年前

    从客户机视图来看,如果服务器上的请求内容相同,服务器状态也相同,对吗?由于服务器随后会严格保存发送的内容,为什么服务器应该以任何类型的错误状态响应? 另一方面,如果请求内容与服务器已经知道的内容相同,客户机为什么要麻烦呢?它已成功传输到服务器,因此完成了大部分工作。如果这种情况有不同的响应代码,客户机应该如何响应?

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