collection

コレクション (HTTP)

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

[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/barWebDAV に適合する資源であっても、 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:summaryatom:idatom:authoratom: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>

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

       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] AtomPubapp: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 LinkingHTTP などで用いられるものですが、 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 は逆方向のリンク関係型です。