コレクション

コレクション (HTTP)

[431] コレクション (collection) は、資源の集合体を表します。 HTTP 自体の用語ではありませんが、 IETF の HTTP 関連各仕様でよく使われる概念です。

[432] IETF ではよく見かけますが、現実世界ではあまり遭遇しない用語ですwww

コレクション (WebDAV)

[8] コレクション (collection) は、 子供の資源への参照の包含子としても機能する資源です >>7。

仕様書

意味

[9] コレクションとは、パスセグメントと資源との写像の集合を含む資源であって、 WebDAV 仕様書の要件に従うものです >>7, >>11。

[12] HTTPメソッドのいくつかはコレクションにのみ適用されますが、 いくつかはコレクションに含まれている資源の一部または全部にも適用されます。 範囲が明らかでない時には、適用対象となる深さを 0 (コレクションのみ)、 1 (コレクションの内部メンバーまで)、無限大 (コレクションのメンバーすべて) と選択できます。 >>11

コレクションの URL

[23] 慣習により、鯖は、末尾に / のない名前でコレクションが参照された際には、 / があったものとして扱っても構いません。その場合、 応答には / で終わる URL を指定した Content-Location: ヘッダーを含めるべきです。 コレクションを参照する URL を生成するときには、 / を含めるべきです。 >>11

[24] コレクションの URL は / で終わるべきです >>29。 クライアントはコレクション名としては / があるものを用いるべきです。そうしない場合リダイレクトに対処する必要があります。 >>11

[25] DAV:resourcetype 特性を使うと URL より確実にコレクションかどうかを判定できます。 >>11

種類

[36] コレクションには次の種別があります。

状態

[13] コレクションは、状態として

... を含みます。その他に、GET で返される payload body などの状態も持つことができます。 >>11

[15] 特性は、コレクション以外の資源の特性と同様のものです >>11。

[14] あるパスセグメントとある資源の写像があるコレクションに含まれている時、 その資源はコレクションに含まれている (contained) >>11 (内部メンバーである >>7) といいます。

[16] コレクションは、あるパスセグメントに関する写像を高々1つだけ含むことができます。 複数のパスセグメントから同じ資源への写像を持つこともできます。 >>11

[17] つまり、同じパスの資源が複数存在することはできませんが、 大文字・小文字不区別など異なるパスが同じ資源を表すことはできます。
[18] PROPFIND は、写像に複数のパスセグメントがあっても、 そのうちのいずれか1つだけを一貫して選んで返さなければなりません >>11。

[19] WebDAV に適合する資源にパスセグメントを足すと別の WebDAV に適合する資源となるなら、前者の資源は後者の資源を含んだコレクションでなければなりません >>11。

[20] 例えば http://example.com/foo/ と http://example.com/foo/bar が共に WebDAV 資源なら、 http://example.com/foo/ はコレクションで、 bar から http://example.com/foo/bar への写像を含んでいなければなりません。

[21] WebDAV に適合する資源にパスセグメントを足した URL で表される資源は、必ずしも WebDAV に適合する資源でなくても構いません。 その場合、前者の資源はコレクションとして後者の資源を含んでも構いませんが、含まなくても構いません >>11。

[26] 例えば http://example.com/foo/index.html が自動生成されるなら、 これは http://example.com/foo/ に含まれないかもしれません。

[22] WebDAV に適合する資源を内部メンバーとして含まない WebDAV に適合する資源は、コレクションである必要はありません。 >>11

[27] WebDAV に適合する資源を含む上位の階層が WebDAV に適合する資源であるとは限りません。クライアントはそのような場合にも対応できなければなりません >>11。

[28] http://example.com/foo/bar が WebDAV に適合する資源であっても、 http://example.com/foo/ はそうでないかもしれません。

[10] 次の各項も参照してください。

collection 要素 (WebDAV)

[31] DAV: 名前空間の collection 要素は、 当該資源がコレクションであることを表します >>30。

[32] コレクションの DAV:resourcetype 特性は、 この要素を含まなければなりません >>30, >>34。

[33] この要素は通常は空要素ですが、 拡張により定義された子要素を使うこともできます >>30。

[35] DAV:resourcetype 特性が collection 要素を含むならコレクション、 含まないならコレクションではない資源として (他の要素に関わらず) 扱うべき (should) です >>34。

歴史

[1] 【WebDAV】

Collection - A resource that contains a set of URIs, termed member URIs, which identify member resources and meets the requirements in section 5 of this specification.

Member 資源を識別する member URI という URI の集合を含み、 この仕様書 (RFC 2518) の5章の用件に合致する資源。 (RFC2518)

コレクション (Atom)

[2]

集成 (collection)
成員資源の集合を含む資源。 集成は Atomフィードとして表現されます。

GET

[424] 集成資源は、エントリーが集成中の成員の IRI を含むようなAtomフィード文書の形の表現を提供しなければなりません。

[425] 詳しくは集成フィードの項を参照してください。

POST

[5] 資源を作成するには、集成の URI に成員の表現を POST します。 AtomPub

[420] AtomPub では1つの資源の複数の表現を作成する方法を規定していません。 AtomPub

[4] 仕様書:

要求

[211] 要求本体は、 Atomエントリーであっても、なくても構いません。 (エントリー資源も媒体資源も POST できます。) AtomPub

[419] クライアントは実体が Atomエントリーであることを表すために媒体型 application/atom+xml または application/atom+xml;type=entry を用いることができます。 AtomPub

応答

[208] 201 応答符号は、成員の作成に成功したことを示します。 その場合、応答本体を返すべきであり、返す場合は作成された資源を表す Atomエントリー文書でなければなりません。 鯖は POST されたエントリーを自由に変更して構いませんから、 クライアントと鯖が新たに作られたエントリーを共有する意味で有用です。 AtomPub

[209] 成員資源が作成された場合、その成員エントリーURI を集成の応答の Location: 頭欄に含まなければなりません。 AtomPub

要求実体がエントリー資源の場合

[210] 要求が Atomエントリー文書を含んでいる場合で、 それに対する応答が Content-Location: 頭欄を含み、 それが Location: 頭欄と文字レベルで一致する場合は、 クライアントは応答実体が新しく作られたエントリーの完全な表現であると解釈してかまいません。 そうでない場合、クライアントは応答実体が作成された資源の完全な表現であると解釈してはなりません。 AtomPub

例

[416]

       POST /edit/ HTTP/1.1
       Host: example.org
       User-Agent: Thingio/1.0
       Authorization: Basic ZGFmZnk6c2VjZXJldA==
       Content-Type: application/atom+xml;type=entry
       Content-Length: nnn
       Slug: First Post

       <?xml version="1.0"?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>Atom-Powered Robots Run Amok</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2003-12-13T18:30:02Z</updated>
         <author><name>John Doe</name></author>
         <content>Some text.</content>
       </entry>

この要求に対する応答の例

       HTTP/1.1 201 Created
       Date: Fri, 7 Oct 2005 17:17:11 GMT
       Content-Length: nnn
       Content-Type: application/atom+xml;type=entry;charset="utf-8"
       Location: http://example.org/edit/first-post.atom
       ETag: "c180de84f991g8"

       <?xml version="1.0"?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>Atom-Powered Robots Run Amok</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2003-12-13T18:30:02Z</updated>
         <author><name>John Doe</name></author>
         <content>Some text.</content>
         <link rel="edit"
             href="http://example.org/edit/first-post.atom"/>
       </entry>
AtomPub より

この例では提出されたエントリーに鯖によって編集用の URL を表す atom:link 要素が加えられています。 Content-Location: 欄は含まれていませんから、 この応答実体が実際に作成された資源の表現そのものと完全に同一かどうかは不明です。

要求実体が媒体資源の場合

[3] Atom 集成に非 Atomエントリー表現が POST により提出されると、鯖は、 要求実体に対応する媒体資源と、 媒体資源についてのメタデータと媒体資源の IRI を含む媒体リンク・エントリーの2つの資源を作らなければなりません。 媒体リンク・エントリーは Atomエントリーとして表現され、 集成中に現れることになります。 AtomPub

[212] 集成は、 POST された実体が認められない、 あるいは未対応の媒体型である場合、 415 状態符号の応答を返して構いません。 鯖はサービス文書の app:accept 要素を使って受け入れる媒体型を示すことができます。 AtomPub

[417] 作成に成功した場合、応答は Location: 頭欄に媒体リンク・エントリーの URI を含めなければなりません。 AtomPub

[6] 媒体リンク・エントリーは、媒体資源IRI を含んだ、リンク関係が edit-media である atom:link 要素を含むべきです。 媒体リンク・エントリーは、 src 属性を持った atom:content 要素を含まなければなりません。 その src 属性の値が新たに作られた媒体資源の IRI です。その IRI は媒体資源IRI と同じであっても構いませんし、 異なっていても構いません。 (例えば、src の資源は静的なもの、媒体資源IRI の資源は動的なものとしても構いません。) AtomPub

[418] 鯖は媒体リンク・エントリーの作成時に atom:summary、atom:id、 atom:author、atom:title のような必須の要素を適当な情報源から得られた情報によって補っても構いません。 鯖はこれら鯖が選んだ値をクライアントが変更することを認めないかもしれません。 AtomPub

例

[422] AtomPub より

PNG 画像を新しい資源として POST します。

       POST /edit/ HTTP/1.1
       Host: media.example.org
       Content-Type: image/png
       Slug: The Beach
       Authorization: Basic ZGFmZnk6c2VjZXJldA==
       Content-Length: nnn

       ...binary data...

鯖は要求実体を新たに作成した媒体資源の表現とし、 新たに媒体リンク・エントリーを作成します。 成功した場合、 201 応答を返します。

       HTTP/1.1 201 Created
       Date: Fri, 7 Oct 2005 17:17:11 GMT
       Content-Length: nnn
       Content-Type: application/atom+xml;type=entry;charset="utf-8"
       Location: http://example.org/media/edit/the_beach.atom

       <?xml version="1.0"?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>The Beach</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2005-10-07T17:17:08Z</updated>
         <author><name>Daffy</name></author>
         <summary type="text" />
         <content type="image/png"
            src="http://media.example.org/the_beach.png"/>
         <link rel="edit-media"
            href="http://media.example.org/edit/the_beach.png" />
         <link rel="edit"
            href="http://example.org/media/edit/the_beach.atom" />
       </entry>

Location: で示されているのが作成された媒体リンク・エントリーの URL です。 edit-media としてリンクされているのが作成された媒体資源の URL です。 新しい PNG 画像に更新する場合は後者に POST します。

       PUT /edit/the_beach.png HTTP/1.1
       Host: media.example.org
       Content-Type: image/png
       Authorization: Basic ZGFmZnk6c2VjZXJldA==
       Content-Length: nnn

       ...binary data...

成功した場合、鯖は 200 を返します。

       HTTP/1.1 200 Ok
       Date: Fri, 8 Oct 2006 17:17:11 GMT

また、先程の前者の URL を使って、クライアントは媒体リンク・エントリーを得ることができます。

       GET /media/edit/the_beach.atom HTTP/1.1
       Host: example.org
       Authorization: Basic ZGFmZnk6c2VjZXJldA==

応答は

       HTTP/1.1 200 Ok
       Date: Fri, 7 Oct 2005 17:18:11 GMT
       Content-Length: nnn
       Content-Type: application/atom+xml;type=entry;charset="utf-8"
       ETag: "c181bb840673b5"

       <?xml version="1.0"?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>The Beach</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2005-10-07T17:17:08Z</updated>
         <author><name>Daffy</name></author>
         <summary type="text" />
         <content type="image/png"
            src="http://media.example.org/the_beach.png"/>
         <link rel="edit-media"
            href="http://media.example.org/edit/the_beach.png" />
         <link rel="edit"
            href="http://example.org/media/edit/the_beach.atom" />
       </entry>

メタデータを更新するには、この URL に PUT します。

       PUT /media/edit/the_beach.atom HTTP/1.1
       Host: example.org
       Authorization: Basic ZGFmZnk6c2VjZXJldA==
       Content-Type: application/atom+xml;type=entry
       Content-Length: nnn
       If-Match: "c181bb840673b5"

       <?xml version="1.0"?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>The Beach</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2005-10-07T17:17:08Z</updated>
         <author><name>Daffy</name></author>
         <summary type="text">
             A nice sunset picture over the water.
         </summary>
         <content type="image/png"
            src="http://media.example.org/the_beach.png"/>
         <link rel="edit-media"
            href="http://media.example.org/edit/the_beach.png" />
         <link rel="edit"
            href="http://example.org/media/edit/the_beach.atom" />
       </entry>

この例では atom:summary が変更されています。 成功した場合は 200 応答が返されます。

       HTTP/1.1 200 Ok
       Date: Fri, 7 Oct 2005 17:19:11 GMT
       Content-Length: 0

要求実体がエントリーでない Atom 文書の場合

[421] Atomエントリー以外の Atom文書 (Atomフィードなど) が POST された場合の結果は未定義です。 AtomPub

メモ

[423] 多分、鯖は PUT されたエントリーがおかしなことを言っていないかチェックする必要がありますね。 媒体資源が他の鯖にあることになっているとか、 媒体リンク・エントリーが元の媒体資源とは別のものを指すことになっているとか。

app:collection 要素 (AtomPub)

[202] AtomPub の app:collection 要素は、 集成を説明します AtomPub。

局所名
collection
文脈
app:workspace の子要素として、 atom:feed の子要素として、 atom:source の子要素として
内容モデル
atom:title & app:accept* & app:categories*
属性
href

仕様書:

内容

[203] この要素は丁度1つの atom:title 要素を含まなければなりません AtomPub。

[204] app:accept 子要素の順序は意味を持ちません。 AtomPub

他の子要素についてはどうなのでしょう。。。

属性

[205] href 属性は必須です。 AtomPub

文脈

[206] この要素は atom:workspace 要素の子要素として、 作業空間に含まれる集成の説明のために使うことができます。

[207] この要素は Atomフィード文書の atom:feed 要素や atom:source 要素の子要素として使うことができます。新しいエントリーを追加するとそのフィードに現れるような集成を表します。 AtomPub

リンク関係型 collection (Web Linking)

[427] Web Linking のリンク関係型 collection は、 対象資源が文脈資源をメンバーとして含むコレクションであることを表します >>426。

仕様書

例

[428] 例えば >>426:

Link: <...>; rel="collection"; title="Return to Product Group X"

[429] Web Linking は HTTP などで用いられるものですが、 RFC 6573 にはなぜか関係がないはずの HTML で使った例 >>426 が載っています:

   <a href="..." rel="collection">View other widgets</a>
   <a href="..." rel="collection">View all discontinued items</a>

[430] 自身がコレクションでもあり、また他のコレクションにも含まれる場合、 item と併用することができます >>426。

Link: <...>; rel="collection item";
      title="A Review of Issac Asimov's Collected Works - Vol. I"

関連

[433] item は逆方向のリンク関係型です。