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