HTTPQUERY
English

207 Multi-Status

用法

当单个 HTTP 请求涉及多个资源时,会返回 207 Multi-Status 响应。例如,一个更新多个数据库的 POST 请求可能对其中一些成功、对另一些失败。响应体会逐一列出每个资源的结果。

默认情况下,消息体是一个以 multistatus 为根元素的 XML 文档。客户端解析每个节点以确定每个子操作的结果。

根元素以任意顺序包含零个或多个 response 元素。每个 response 都包含一个用于标识目标资源的 href 元素。存在两种格式:状态要么指向资源整体,要么指向资源的特定属性。

WebDAV

207 Multi-Status 状态码主要由 WebDAV 使用。标准 HTTP 客户端在 WebDAV 工作流之外很少遇到该响应。

资源整体的状态

子元素 status 保存所标识资源的最终 HTTP 状态码。客户端应当处理这里出现的标准 HTTP 状态码。

<d:response>
  <d:href>http://example.re/tasks</d:href>
  <d:status>HTTP/1.1 200 OK</d:status>
</d:response>

各个属性的状态

PROPFIND 和 PROPPATCH 方法使用 propstat 代替 status,以报告资源的各个属性。

<d:response>
  <d:href>http://example.re/tasks</d:href>
  <d:propstat>
    <d:prop>
      <d:getcontentlanguage>
        "en-CA"
      </d:getcontentlanguage>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
</d:response>

成功或失败标识

207 Multi-Status 响应可以表示整体成功、整体失败或二者兼有。客户端检查每个 response 元素以评估操作的完成情况。

示例

客户端向服务器提交 XML 数据。其中涉及三个相互独立的资源,服务器逐一返回每个资源的结果。

前两个资源成功:第一个不返回消息体(204),第二个确认创建了新资源(201)。第三个资源报告 423 错误,因为持有一个锁。客户端根据这些各自的状态码判断整体操作成功还是失败。

请求

POST /signup HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 93

<?xml version="1.0"?>
<person>
  <name>David Smith</name>
  <country>USA</country>
</person>

响应

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 568

<?xml version="1.0" encoding="utf-8" ?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>http://example.re/signup/r1</d:href>
    <d:status>HTTP/1.1 204 No Content</d:status>
  </d:response>
  <d:response>
    <d:href>http://example.re/signup/r2</d:href>
    <d:status>HTTP/1.1 201 Created</d:status>
  </d:response>
  <d:response>
    <d:href>http://example.re/signup/r3</d:href>
    <d:status>HTTP/1.1 423 Locked</d:status>
    <d:error><d:lock-token-submitted/></d:error>
  </d:response>
</d:multistatus>

代码参考

.NET

HttpStatusCode.MultiStatus

Rust

http::StatusCode::MULTI_STATUS

Rails

:multi_status

Go

http.StatusMultiStatus

Symfony

Response::HTTP_MULTI_STATUS

Python3.5+

http.HTTPStatus.MULTI_STATUS

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_MULTI_STATUS

Angular

@angular/common/http/HttpStatusCode.MultiStatus