HTTP状态码部分成功的请求

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

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

如果不允许在列表中包含缺少的用户,这个问题就可以避免。那么发送尝试只会得到一个4xx 的错误。但是这样形成 API 是没有意义的。 另一方面,我可以认为错误条件纯粹是应用程序特有的。但是送一个200就感觉不对了。如果能给客户机一个提示,告诉他们什么时候应该深入查看错误响应,那就太好了。例如,避免一次又一次地向该用户发送消息

93337 次浏览

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

回到200是正确的事情。就 HTTP 而言,正确接收请求、正确处理请求并将响应发送回来。因此,在 HTTP 级别上一切正常。与运行在 http 之上的应用程序相关的任何错误或警告都应该在响应中。这样做还可以防止代理服务器可能遇到的一些棘手问题,这些代理服务器可能无法以您预期的方式处理某些响应。

我处理过一个非常类似的问题

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 扩展,您还需要对客户机进行控制。

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

  • HTTP 返回代码 202: Accepted,表明请求正常,但是不能保证所有事情实际上都按照它应该的方式进行。
  • 在响应中返回一个正常的 200,但包括响应主体中没有结果的列表。

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

使用206部分内容怎么样。我知道206更多的是关于范围,但是如果它可以表示一个部分成功的请求呢?

我需要同样的问题,在阅读了一些文档之后,这个问题的最佳解决方案似乎是使用非标准的2xx 响应。一般客户端将把这视为成功,但特定客户端可以理解发生了什么。您还可以使用表单 X- 失败的自定义标头来支持这一点: this part 代码。您可能应该将操作的问题作为文本包括在内,以便通用客户端能够显示所发生事件的性质。下面是我所做的文件上传,但处理不能在这一刻:

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.