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

Nor*_*rtl 96 rest http http-status-codes

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

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

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

Arn*_*rne 59

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

  • HTTP返回代码202: Accepted,表明请求是正常的,但并不能保证一切都按原样运行.
  • 返回200响应中的法线,但包括响应正文中没有显示的内容列表.

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

  • 是的,@Sinaesthetic。根据最新的 HTTP 1.1 规范,“(...)请求已被接受处理,但处理尚未完成”。因此,对于部分成功,202“不”合适。 (9认同)
  • 202是否更多地指的是排队? (3认同)
  • 这非常有意义,谢谢 (2认同)

Kyl*_*lar 57

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

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>
Run Code Online (Sandbox Code Playgroud)

但同样,这是一个HTTP扩展,您还需要控制客户端.

  • 我想过用这个但我对它不太满意.谢谢! (2认同)

Cem*_*ncu 5

我需要同样的问题,在阅读了一些文档后,这个问题的最佳解决方案似乎是用非标准 2xx 响应进行响应。一般客户会将其视为成功,但特定客户可以理解发生了什么。您还可以使用 X-failed: thispart 代码形式的自定义标头来支持此功能。您可能应该以文本形式包含操作的问题是什么,以便通用客户端能够显示所发生情况的本质。这是我在上传文件但目前无法完成处理时所做的操作:

HTTP/1.1 210 Partial success
X-failed: processing
X-reason: server busy

File has been uploaded, however, the task associated with the 
file has not started as the server is busy. Re-request processing
at a later time.
Run Code Online (Sandbox Code Playgroud)