[31] [DFN[[CODE(HTTP)[[[207]]]]]] は、複数の[[資源]]に対する処理の結果の[[応答]]を1つにまとめたものを表す[[状態符号]]です。

* 仕様書

[REFS[
- [23] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.1>
- [25] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.2>
- [27] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.6>
- [28] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.8>
- [29] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.9>
- [30] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.10>
- [2] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-13>
- [5] '''[CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-13>'''
- [20] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.16>
- [22] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-17>
]REFS]

* 意味

[6] [CODE(HTTP)[[[207]]]] [[応答]]は、複数の[[資源]]があって複数の[[状態符号]]が適切であろう場合にその情報を伝えるものです [SRC[>>5]]。

[9] [CODE(HTTP)[[[207]]]] は [CODE(HTTP)[[[2xx]]]]、すなわち成功に分類されてはいますが、
含まれる個々の結果は成功とは限らず、部分的な成功だったり、失敗だったりします [SRC[>>5]]。

* 構文

[17] [CODE(HTTP)[[[207]]]] [[応答]]では [CODE(HTTP)@en[[[Location:]]]]
[[ヘッダー]]を使うと [[URL]] の解釈が曖昧になる [SRC[>>5]] として、
その用法は意図的に未定義 [SRC[>>5]] とされています。

;; [18] なぜ禁止しないのかは謎ですが・・・。

[7] 既定の [[payload body]] は [CODE(MIME)@en[[[text/xml]]]] または
[CODE(MIME)@en[[[application/xml]]]] で、 [CODE(XMLe)@en[[[multistatus]]]]
[[要素]]が[[根要素]]であるものです [SRC[>>5]]。

;; [[XML MIME型]]も参照。

[FIG(railroad)[
= [CODE(XMLe)@en[[[multistatus]]]]
]FIG]

[10] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の 
[DFN[[CODE(XMLe)@en[[[multistatus]]]]]] [[要素]]は、
[[根要素]]として使用して [SRC[>>5]] 複数の[[応答]]を束ねるもの [SRC[>>20]] で、
[[要素内容]] [SRC[>>20]] として0個以上の [CODE(XMLe)@en[[[response]]]]
[[要素]] [SRC[>>5, >>20]] と省略可能な [CODE(XMLe)@en[[[responsedescription]]]] [[要素]]
[SRC[>>20]] を含むことができます。

[12] 各 [CODE(XMLe)@en[[[response]]]] [[要素]] [SRC[>>5]] および
[CODE(XMLe)@en[[[responsedescription]]]] [[要素]]の順序は任意です。 [SRC[>>5, >>22]]

[11] [CODE(XMLe)@en[[[response]]]] [[要素]]は各[[資源]]についての情報を含めたものであり、
それぞれの[[資源]]を識別する [CODE(XMLe)@en[[[href]]]] [[要素]]を含まなければ[['''なりません''']] [SRC[>>5]]。

[13] [CODE(XMLe)@en[[[response]]]] [[要素]]にはその他に [CODE(XMLe)@en[[[status]]]]
[[要素]]か [CODE(XMLe)@en[[[propstat]]]] [[要素]]を含めます [SRC[>>5]]。

[FIG(railroad)[
= [CODE(XMLe)@en[[[href]]]]
= |
== [CODE(XMLe)@en[[[status]]]]
== [CODE(XMLe)@en[[[propstat]]]]
= ?
== [CODE(XMLe)@en[[[location]]]]
]FIG]

[1] [[応答]]中で用いる [[URL]] については構文上の制約があります。

;; [[単純参照]]を参照。

[14] [CODE(XMLe)@en[[[status]]]] [[要素]]は、 [CODE(XMLe)@en[[[href]]]] [[要素]]で指定された[[資源]]について操作を実行した結果の状態を示します [SRC[>>5]]。

[15] ここで使う[[状態符号]]は[[要求メソッド]]の定義で明示的に規定されていることもありますが、
[[クライアント]]はそれ以外であっても [[HTTP]] の規則に従って処理できなければ[['''なりません''']] [SRC[>>5]]。

[16] [CODE(XMLe)@en[[[propstat]]]] [[要素]]は、 [CODE(HTTP)@en[[[PROPFIND]]]]
や [CODE(HTTP)@en[[[PROPPATCH]]]] で使用します [SRC[>>5]]。
[CODE(XMLe)@en[[[href]]]] [[要素]]で指定された[[資源]]の個々の[[特性]]についての情報を表します [SRC[>>5]]。

[8] [CODE(XMLe)@en[[[response]]]] [[要素]]内では [CODE(HTTP)[[[2xx]]]],
[CODE(HTTP)[[[3xx]]]], [CODE(HTTP)[[[4xx]]]], [CODE(HTTP)[[[5xx]]]]
の[[状態符号]]を使います。 [CODE(HTTP)[[[1xx]]]] は使う[['''べきではありません''']]。
[SRC[>>5]]

[19] [CODE(HTTP)[[[3xx]]]] を使う場合には、[[リダイレクト]]先の[[URL]] を
[CODE(XMLe)@en[[[location]]]] [[要素]]によって記述できます。

;; [CODE(HTTP)[[[3xx]]]] と [CODE(XMLe)@en[[[location]]]] を参照。

* 文脈

[24] [CODE(HTTP)@en[[[207]]]] [[応答]] / [CODE(XMLe)@en[[[multistatus]]]]
[[要素]]は、 [CODE(HTTP)@en[[[PROPFIND]]]] [[要求]]に対する[[応答]]で使われます [SRC[>>23]]。

[26] [CODE(HTTP)@en[[[207]]]] [[応答]] / [CODE(XMLe)@en[[[multistatus]]]]
[[要素]]は、 [CODE(HTTP)@en[[[PROPPATCH]]]] [[要求]] [SRC[>>25]] や
[CODE(HTTP)@en[[[DELETE]]]] [[要求]] [SRC[>>27]]、
[CODE(HTTP)@en[[[COPY]]]] [[要求]] [SRC[>>28]]、
[CODE(HTTP)@en[[[MOVE]]]] [[要求]] [SRC[>>29]]、
[CODE(HTTP)@en[[[LOCK]]]] [[要求]] [SRC[>>30]]
に対する[[応答]]で使うことがあります。

[32] 理論上は [[WebDAV]] 以外でも使えるはずですが、実際には [[WebDAV]]
以外で使われるところは見たことがありません。全体としては成功とみなして
[CODE[[[200]]]] で実行状況詳細を説明した [[JSON]] を返したり、
全体として失敗と考えて [CODE[[[400]]]] などを返したりするものと思われます。
(どちらが適切かは[[応用]]によって違いそうです。)

* 歴史

[FIG(quote)[
[FIGCAPTION[
[3] RFC 2518 (WebDAV) 10.2 207 Multi-Status
]FIGCAPTION]

> The 207 (Multi-Status) status code provides status for multiple
independent operations (see section 11 for more information).

[CODE(HTTP)[207]] (複数状態) 状態符号は、複数の独立の操作に対する状態を提供します。
]FIG]

[FIG(quote)[
[FIGCAPTION[
[4] RFC 2518 11 Multi-Status Response
]FIGCAPTION]

> The default 207 (Multi-Status) response body is a text/xml or
application/xml HTTP entity that contains a single XML element called
multistatus, which contains a set of XML elements called response
which contain 200, 300, 400, and 500 series status codes generated
during the method invocation.  100 series status codes SHOULD NOT be
recorded in a response XML element.

既定の [CODE(HTTP)[207]] (複数状態) 応答本体は
[CODE(MIME)[[[text/xml]]]] 又は [CODE(MIME)[[[application/xml]]]]
の HTTP 実体本体で、 [CODE(XML)[[[multistatus]]]] という単一の XML
要素を含んでおり、その要素は [CODE(XML)[[[response]]]]
という XML 要素の集合で、この要素は method
の呼び出しの過程で生成された [CODE(HTTP)[[[200]]]],
[CODE(HTTP)[[[300]]]], [CODE(HTTP)[[[400]]]], [CODE(HTTP)[[[500]]]]
の系列の状態符号を含みます。 [CODE(HTTP)[[[100]]]]
系列の状態符号は [CODE(XML)[record]] XML 要素中に記録する'''べきではありません'''。
]FIG]

[FIG(quote)[
[FIGCAPTION[
[21] RFC 2518 (WebDAV) 12.9 multistatus XML Element
]FIGCAPTION]

>
:   Name:       [CODE(DAVe)[[[multistatus]]]]
:   Namespace:  [CODE(URI)[[[DAV:]]]]
:   Purpose:    Contains multiple response messages.
:   Description: The responsedescription at the top level is used to
provide a general message describing the overarching nature of the
response.  If this value is available an application may use it
instead of presenting the individual response descriptions contained
within the responses.

:目的:複数の応答メッセージを含める
:説明:最上位の [CODE(DAVe)[[[responsedescription]]]] は、応答の支配的性質を説明する一般的メッセージを提供するのに使います。
この値が利用可能な場合応用は [CODE(DAVe)[[[response]]]] 中の個々の応答説明を提示する代わりにこの値を使って構いません。

> <!ELEMENT multistatus (response+, responsedescription?) >
]FIG]

[33] [CITE@en[RFC 3648 - Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol]]
([TIME[2017-09-24 19:10:29 +09:00]])
<https://tools.ietf.org/html/rfc3648#section-7>

[34] [CITE@en[RFC 4791 - Calendaring Extensions to WebDAV (CalDAV)]]
([TIME[2017-09-24 16:22:36 +09:00]])
<https://tools.ietf.org/html/rfc4791#section-5.3.1.1>

[35] [CITE@en[RFC 5323 - Web Distributed Authoring and Versioning (WebDAV) SEARCH]]
([TIME[2017-10-01 13:49:21 +09:00]])
<https://tools.ietf.org/html/rfc5323#section-2.3>

[FIG(quote)[
[FIGCAPTION[
[36] [CITE@en[Zalando RESTful API と イベントスキーマのガイドライン]]
([TIME[2018-06-20 22:36:56 +09:00]])
<https://restful-api-guidelines-ja.netlify.com/>
]FIGCAPTION]

> バッチ/バルクリクエストには、 常に ステータスコード 207 を返さなければならない。 ただし個々のパートを処理する前にエラーが発生した場合はその限りではない。
> バッチ/バルクレスポンスは、 常に バッチ/バルクリクエストの各パートに関する十分なステータスと モニタリング情報を含む、複数状態をもつオブジェクトを、ステータスコード207とともに返す。

]FIG]
