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

部分成功请求的HTTP状态代码,http,rest,http-status-codes,Http,Rest,Http Status Codes,我有一个向用户发送消息的应用程序。在post请求中,传输一个XML字符串,该字符串由应接收该特定消息的所有用户组成。如果列表中的任何用户不存在,我会将缺少的用户列表返回给客户端进行进一步评估 现在我在问自己,应用程序的正确状态代码是什么,表示请求已被接受,但有些事情无法完成 如果不允许在列表中包含丢失的用户,那么问题就可以避免。然后,发送尝试只会得到一个4xx错误。但是,以这种方式形成API是没有意义的。 另一方面,我可以认为错误条件纯粹是应用特定的。但发送一个200美元的邮件是不合适的。当深入

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

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

如果不允许在列表中包含丢失的用户,那么问题就可以避免。然后,发送尝试只会得到一个4xx错误。但是,以这种方式形成API是没有意义的。
另一方面,我可以认为错误条件纯粹是应用特定的。但发送一个200美元的邮件是不合适的。当深入查看错误响应时,最好给客户端一个提示。e、 g.为了避免一次又一次地向用户发送消息,超文本传输协议处理事物的传输端。它没有用于处理应用程序级错误的错误代码


在这里返回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>

用户-123
成功
user-789
失败

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

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

  • HTTP返回代码
    202:Accepted
    ,表示请求没有问题,但不能保证一切都按预期进行
  • 在响应中返回一个正常的
    200
    ,但在响应正文中包含一个没有得到结果的列表

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

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

HTTP是一种应用程序级协议。您不能简单地将其放在传输和应用程序级别。如果你考虑OSI,那么HTTP在第5-7层。HTTP有些不同。大多数标题和返回代码确实是特定于应用程序的。代码只依赖于HTTP协议实体中给出的信息,而不依赖于自定义应用程序格式。关于200,我想说,如果你的定义适用于非POST动词,那它是完全错误的。但是POST稍微改变了游戏,在这种情况下,您的假设“处理得当”是不确定的,严格来说OSI认为HTTP是一种应用程序级协议,当与“普通”Web服务器交谈时,这是正确的。但在您的情况下,您正在HTTP之上运行自己的协议,就像现在许多应用程序一样。在这种情况下,HTTP只提供传输。(您的应用程序正在向用户发送消息,而不是传输超文本…)只是为了澄清一下。HTTP以REST方式是以资源为中心的。在此上下文中,200表示标识(您指定的资源),而不是指向标识方向的3xx。使用POST将资源URI转换为处理URI,并且需要处理错误代码。上下文有点偏移,事物的定义有点模糊或至少难以理解。上下文偏移还意味着没有合适的错误代码,因为协议的设计从来没有考虑过上下文;-)我还认为您应该小心使用错误代码,因为代理服务器往往会使用它们来运行,并用自定义错误页替换您的响应,这可能是一个真正的PITA。无论如何,感谢您回答我的问题。我刚刚发现stackoverflow是一个糟糕的聊天客户端:)我曾想过使用它,但我对它不太满意。谢谢它的好处是,您可以返回任意多或少的相关数据,这对于混合数据集尤其有用,例如:有些失败,有些通过。我理解。我只是想避免额外的状态处理(这对IMHO来说并不好)。我的大部分代码都使用HTTP代码。我认为我所描述的用例在没有的情况下会很好。你总是可以发送一个正文-发送一个带有JSON响应的200或者任何你想要的东西来确定哪些是成功的。是的,我知道。但如果返回一个实体,则需要对其进行解析。此时,您将引入第二层应用程序逻辑处理。这增加了复杂性,你需要一个很好的理由去做。202不是更像是指排队吗?是的,@sin美学。根据最新的HTTP 1.1规范,“(…)已接受请求进行处理,但处理尚未完成”。因此,对于部分成功,202不合适。IMO 200明确允许部分成功,因为有效负载的预期含义被指定为POST、PUT和DELETE的状态。状态202是异步调用的成功启动,其结果尚不清楚。类似于获得承诺/未来。响应应该告诉如何获得实际结果,或者至少监控状态。状态如下:“HTTP 206部分内容成功状态响应代码表示请求已成功