部分成功请求的HTTP状态代码

时间:2011-12-12 10:33:08

标签: http rest http-status-codes

我有一个向用户发送消息的应用程序。在post请求中,传输的XML字符串由应该接收该特定消息的所有用户组成。如果列表中的任何用户不存在,我将缺少用户的列表返回给客户端以进行进一步评估。

现在我问自己,应用程序的正确状态代码是什么,表示该请求已被接受但有些事情无法完成。

如果不允许在列表中包含缺少的用户,则可以避免该问题。然后发送尝试只会得到4xx错误。但是以这种方式形成API毫无意义。 另一方面,我可以认为错误条件纯粹是应用程序特定的。但发送200只是感觉不对。如果深入了解错误响应,给客户端提供一个提示会很好。例如避免一遍又一遍地向该用户发送消息

4 个答案:

答案 0 :(得分:54)

我遇到了同样的问题,我最终使用了两种不同的解决方案:

  • HTTP返回代码202: Accepted,表示请求正常,但不保证所有内容实际上都按预期进行。
  • 在回复中返回正常的200,但请列出未在回复正文中展示的内容。

第二个通常效果最好,但如果您懒惰或使用队列进行处理,第一个很好。

答案 1 :(得分:50)

我处理过一个非常类似的问题。在这种情况下,我返回了

207多状态

现在,这不是严格的HTTP,它是WebDAV扩展的一部分,所以如果你也无法控制客户端,那么这对你不利。如果你这样做,你可以这样做:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

但同样,这是一个HTTP扩展,你也需要控制客户端。

答案 2 :(得分:0)

使用206部分内容怎么办。我知道206的范围更多,但是如果它可以指示部分成功的请求该怎么办?

答案 3 :(得分:-11)

超文本传输​​协议处理事物的传输方面。它没有错误代码来处理应用程序级错误。

返回200是正确的做法。就HTTP而言,请求已正确接收,正确处理并且您正在发回响应。所以,在HTTP级别上一切都很好。在http之上运行的与应用程序相关的任何错误或警告都应该在响应中。这样做还可以防止您可能遇到的代理服务器遇到的一些令人讨厌的问题,这些问题可能无法按照您的预期处理某些响应。