HTTPQUERY
日本語

207 Multi-Status

使い方

207 Multi-Status レスポンスは、1つの HTTP リクエストが複数のリソースに影響する場合に返されます。たとえば、複数のデータベースを更新する POST リクエストは、一部では成功し他では失敗することがあります。レスポンスボディには各リソースの個別の結果が列挙されます。

デフォルトでは、ボディは multistatus をルート要素とする XML ドキュメントです。クライアントは各ノードを解析して、すべてのサブ操作の結果を判断します。

ルート要素には0個以上の response 要素が任意の順序で含まれます。各 response には、対象リソースを識別する href 要素が含まれます。2つの形式が存在します。ステータスがリソース全体を指す場合と、リソースの特定のプロパティを指す場合です。

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 メソッドは、リソースの個々のプロパティについて報告するために status の代わりに propstat を使用します。

<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 データをサーバーへ POST します。3つの独立したリソースが関与しており、サーバーはそれぞれについて個別の結果を返します。

最初の2つのリソースは成功します。1つ目はボディを返さず(204)、2つ目は新しいリソースが作成されたことを確認します(201)。3つ目のリソースはロックが保持されているため 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