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


115

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

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

如果不允许在列表中包含丢失的用户,则可以避免该问题。然后,发送尝试将仅收到4xx错误。但是以这种方式形成API毫无意义。另一方面,我可以认为错误情况纯粹是特定于应用程序的。但是发送200只是感觉不对。最好在发生错误响应时向客户端提供提示。例如,避免一遍又一遍地向该用户发送消息

Answers:


66

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

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


3
我曾考虑过使用它,但我对此不太满意。谢谢!
Norbert Hartl

这样做的好处是,您可以根据需要返回或多或少的相关数据-这对于混合数据集尤其有用,即:有些失败而有些通过。
凯拉尔

我明白。我只是想避免额外的状态处理(恕我直言,恕我直言)。我的大部分代码都与HTTP一起使用。而且我认为我所描述的用例如果没有的话会很好。
Norbert Hartl

您始终可以将正文发送回-发送带有JSON响应的200或您想要的任何内容,以确定哪些成功。
凯拉尔

是的我知道。但是,如果您返回一个正文,则需要对其进行解析。到那时,您将引入第二层应用程序逻辑处理。这会增加复杂性,然后您需要一个充分的理由进行此操作。
Norbert Hartl

65

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

  • HTTP返回码202: Accepted,指示请求正常,但是不能保证一切都按预期进行。
  • 200在响应中返回法线,但在响应正文中包含未列出的内容列表。

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


5
202是否更多地指的是排队?
Sinaesthetic,

6
是的,@ Sinaesthetic。根据最新的HTTP 1.1规范,“(...)请求已接受处理,但处理尚未完成”。因此,对于部分成功,202是恰当的。
Huercio '19

-4

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


MDN的状态如下:“ HTTP 206部分内容成功状态响应代码表示请求已成功完成,并且正文包含请求的数据范围,如请求的Range标头中所述。” 据我了解,“ 206部分内容”严格适用于具有内容范围的请求。
sbbs

-14

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

返回200是正确的做法。就HTTP而言,请求已被正确接收,正确处理,并且您正在将响应发送回去。因此,在HTTP级别上一切正常。在http顶部运行的与应用程序相关的任何错误或警告都应包含在响应中。这样做还可以避免代理服务器可能遇到的一些棘手问题,这些代理服务器可能无法以您期望的方式处理某些响应。


18
HTTP是应用程序级别的协议。您不能仅仅将其放在传输和应用程序级别上。如果考虑OSI,则HTTP位于第5-7层。HTTP有所不同。实际上,大多数标头和返回码都是特定于应用程序的。这些代码仅取决于HTTP协议实体中提供的信息,而不取决于自定义应用程序格式的内容。关于200,我想说的是,如果将其定义应用于不是POST的动词,那是完全错误的。但是POST稍微改变了游戏,在这种情况下,您也无法确定“处理正确”的假设
Norbert Hartl

严格来说,OSI将HTTP视为应用程序级别的协议,当与“正常”网络服务器通信时,这是事实。但是,就您而言,您正在HTTP之上运行自己的协议,就像如今许多应用程序一样。在这种用法中,HTTP仅提供传输。(您的应用程序正在向用户发送消息,而不是传输超文本...)
AVee 2011年

2
只是要清楚。以REST方式进行的HTTP以资源为中心。在这种情况下,200表示身份(您指定的资源),而不是指向身份方向的3xx。使用POST将资源URI转换为处理URI,并且需要使用错误代码来解决。上下文有所变化,事物的定义变得模糊或至少难以理解
Norbert Hartl

1
上下文转换也意味着没有合适的错误代码,因为该协议从未在设计时考虑到该上下文;-)我也认为您应该谨慎使用错误代码,因为代理服务器往往会运行它们并用一个替换您的响应自定义错误页面,这可以是真实的PITA。
AVee 2011年

1
无论如何,感谢您回答我的问题。我刚刚发现stackoverflow是糟糕的聊天客户端:)
Norbert Hartl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.