部分成功请求的HTTP状态码

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

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

如果不允许在列表中包含缺less的用户,则可以避免该问题。 然后发送尝试只会得到一个4xx错误。 但是用这种方式来形成API没有任何意义。 另一方面,我可以认为错误条件是纯应用程序特定的。 但发送一个200只是不正确的。 给客户一个暗示错误响应的提示是很好的。 例如避免一遍又一遍地向用户发送消息

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

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扩展,你也需要控制客户端。

我遇到了同样的问题,最后我使用了两种不同的解决scheme:

  • HTTP返回代码202: Accepted ,表示请求正常,但不能保证所有事情都按照原样进行。
  • 在响应中返回一个正常的200 ,但是包含一个没有在响应体中泛出的列表。

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

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

回200是在这里做的正确的事情。 就HTTP而言,请求被正确接收,正确处理,并且您发送回应。 所以,在HTTP层面上,一切正常。 任何与http上运行的应用程序相关的错误或警告都应该在响应中。 这样做也可以防止您可能遇到的代理服务器可能无法处理某些响应的方式,您可能会遇到一些讨厌的问题。