【注意】 このドキュメントは、W3CのLinked Data Platform Paging 1.0 W3C Working Group Note 30 June 2015の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2015年8月27日
Copyright © 2015 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and document use rules apply.
このドキュメントは、URLのアドレスで指定可能な別個のページ資源にレスポンスを分割することにより、クライアントとサーバーが大きなリンクト・データ・プラットフォーム資源表現を効率的に検索可能となるHTTPベースのプロトコルについて記述しています。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
ワーキンググループは、提起されたすべての問題に対応し、リンクト・データ・プラットフォーム[LDP]からLDPページングを分離するという決定を含む、その他の本質的な変更が行われました。テストスイートの開始も利用可能となりました[LDP-PAGING-TESTSUITE]。
この仕様は、以前に勧告候補(CR)として公表されました。現在の憲章のもとで残された時間内にCRの終了基準を満たすには実装が不十分であったため、ワーキンググループは、W3C勧告トラックから外し、将来の参照のためのW3Cノートとして公表することにしました。このドキュメントは、部分的または全体的に、将来別のWGが再利用できるかもしれませんし、できないかもしれません。
このドキュメントは、リンクト・データ・プラットフォーム・ワーキンググループによってワーキンググループ・ノートとして発表されました。このドキュメントに関してコメントを行いたい場合には、public-ldp-comments@w3.org(購読、アーカイブ)にお送りください。どのようなコメントでも歓迎します。
Please see the Working Group's implementation report.
ワーキンググループ・ノートとしての公開は、W3Cメンバーによる承認を意味するものではありません。これは草案ドキュメントであるため、他のドキュメントによって、随時更新されたり、置き換えられたり、廃止されることもありえます。このドキュメントを「作業中」以外のものとして引用することは適当ではありません。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リスト を維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
このドキュメントは、2005年10月14日のW3Cプロセス・ドキュメントによって管理されています。
この項は非規範的です。
この仕様では、大きなページ付きHTTP資源の状態を、より小さな負荷でサーバーが表現できるように、小さなサブセット資源(ページ)のリストとして利用できるように広く再利用可能なパターンを提供します。ページ付き資源は、LDP資源(LDPRs)[LDP]でなければなりません。任意のLDPRにページングを行えますが、順序付けなどのページングに関するある側面が明確に定義されているのは、LDP-RSsやLDPCsなどの、LDPRsの特定のサブクラスに対してのみです。
クライアントがページ付き資源を検索しようとした時には、 サーバーは、「先頭ページ」資源にクライアントをリダイレクトするか、クライアントのリクエストのプレファレンスやサーバー性能に応じて、そのレスポンス内で「先頭ページ」資源の表現を提供します。レスポンスには、他のページへのリンクがシーケンスとして含まれ、 その後のページでも同様です。ページングに対応しているクライアントは、LDP-RSのページの結合方法や、場合によっては他のLDPRsの結合方法について(他の仕様により)知っています。LDPページングは、例えば、クライアントがページのトラバースをできる限り早く断念できるように、ページ付き資源の変更をクライアントが知ることができるメカニズムを定義します。ページングの詳細な例は、4項 メッセージ交換のページングの例で示しています。
ページ付き資源がLDPCでもある場合には、サーバーが想定通りにページにメンバーを割り当てて、その割り当てアルゴリズムをクライアントに伝達できれば、何らかの効率の向上が望めます。7項 リンクト・データ・プラットフォーム・コンテナは、この一般的な実装アルゴリズムを扱うために、ページへのメンバー割り当てのソート順序を伝達する機能を定義しています。
前後関係や背景に関しては、リンクト・データ・プラットフォーム・ユース・ケースおよび要件[LDP-UCR]を読むと有用かもしれません。
この項は非規範的です。これは、読者の利便性のために、[LDP]で形式的に定義されている用語のサブセットをまとめたものです。
以下の用語は、W3Cのウェブ・アーキテクチャ[WEBARCH]、ハイパーテキスト転送プロトコル([RFC7230]、[RFC7231])、およびリンクト・データ・プラットフォーム[LDP]に基づいています。
ページ付き資源は、ページ付きフィード[RFC5005]に詳しい読者にとっては、論理的フィードと似ています。任意の資源は、きっかり1ページから成るページ付き資源であるとみなされます(そうすることの利便性は明らかではありませんが)。
クライアントがシーケンスの資源の表現を結合する場合には、クライアントはページ付き資源の状態のコピーを持っています。クライアントがシーケンスの資源を検索している間にページ付き資源が変更された場合には、クライアントが持っているそのページ付き資源の状態のコピーは不完全だったり、ページ付き資源の任意の時点の状態と一致しない可能性があります。したがって、この検索と結合プロセスの結果が、クライアントが1回のリクエストで得る状態(それが可能であったならば)と同じであることを強く保証することはできませんが、LDPは、検索プロセス中にページ付き資源の状態がいつ変更されたかをクライアントが検出する方法を提供します。検索プロセス中に、ページ付き資源の状態が変わらない限り、クライアントが持っているページ付き資源の状態のコピーは、サーバーの実装によって得られるものと同じくらい正確です。
ページ付き資源PがLDP-RSであれば、個々のシーケンス内ページ資源の表現にはPのトリプルのサブセットが含まれ、クライアントは、それらのグラフを統合することでそれらを結合できます。LDPでは、LDP-RSs以外の資源のページングを行うことはできますが、クライアントがそれらの表現を結合する方法は規定されていません。さらなる詳細については、6項 リンクト・データ・プラットフォーム資源を参照してください。
ページ・シーケンスは、ページ付きフィード[RFC5005]に詳しい読者にとっては、ページ付きフィードと似ており、同じ留意点(上記と同じ)の多くが当てはまります。注:ページ付き資源と個々のページ資源が同じような文脈で言及される場合に、作者や読者が両者を明確に区別できるようにする目的で用語の選定を行いました。
注:ページ・シーケンスは、前向きトラバースのみを用いた場合に、ページ付き資源から始まるトラバースがどのように行われるかという観点で記述され名付けられています。これは、それ以上のことを意味するものではなく、この選択は任意です。例えば、前向きリンクを辿ることは、シーケンスにおいてより後の資源がより新しいということを意味しません。前向きは、時間を前後に、または、その他のある次元に沿って移動することと一致している場合もありますが、そのような関係はサーバー固有のものです。後で定義しているようなLDPC表現に関する追加の具体的な言明がない限り、これは、LDPページングでは暗示されません。
303
レスポンス) ページです。構文的には、HTTPのLink <P1>; rel="first"
ヘッダー[RFC5988]です。
Link <Pi>; rel="next"
ヘッダー[RFC5988]です。
Link <Pn>; rel="last"
ヘッダー[RFC5988]です。
Link <Pi>; rel="prev"
ヘッダー[RFC5988]です。
注:「前」は、ページ・シーケンス内の一方向に対する名前以上のものを意味すると解釈すべきではありません。例えば、前のリンクを辿るということは、ページ・シーケンス内でより後の資源がより新しいということを意味しません。前方向は、時間を前に移動することと一致している場合もありますが、後で定義しているようなLDPC表現に関する追加の具体的な言明がない限り、任意のそのような関係はサーバー固有のものであり、LDPページングでは暗示されません。
注:「後ろ」は、ページ・シーケンス内の一方向に対する名前以上のものを意味すると解釈すべきではありません。
LDPページングの名前空間は、http://www.w3.org/ns/ldp#
です。
資源表現の例は、text/turtle
の形式[turtle]で提供しています。
一般的に用いられる名前空間接頭辞は次のとおりです。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix ldp: <http://www.w3.org/ns/ldp#>.
非規範的と記している項と同じく、この仕様のすべての作成ガイドライン、図、例、注は、非規範的です。この仕様のその他の部分はすべて規範的です。
「することができる/してもよい(MAY)」、「しなければならない(MUST)」、「してはならない(MUST NOT)」、「すべきである/する必要がある(SHOULD)」、「すべきでない/する必要がない(SHOULD NOT)」というキーワードは、[RFC2119]で記述されているように解釈されるべきです。
リンクト・データ・プラットフォーム・ページング1.0(このドキュメント)の各項のステータスは次のとおりです。
適合LDPページング・クライアントは、LDPページングで定義されている規則に従った適合LDPクライアント[LDP]です。
適合LDPページング・サーバーは、LDPページページングで定義されている規則に従った適合LDPサーバー[LDP]です。
この項は非規範的です。
Example Co.の顧客関係データはhttp://example.org/customer-relations
というURIで識別され、同じURIを用いて検索可能です。
LDPページングを理解しない標準的なHTTPクライアントは、通常の方法で資源の表現を取得します。
リクエストGET /customer-relations HTTP/1.1 Host: example.org Accept: text/turtle
サーバーのレスポンスは次のとおりです。
レスポンス:HTTP/1.1 200 OK Content-Type: text/turtle ETag: "_87e52ce291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type" Allow: GET,OPTIONS,HEAD @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix dcterms: <http://purl.org/dc/terms/>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. @base <http://example.org/customer-relations>. <> a o:CustomerRelations; dcterms:title "The customer information for Example Co."; o:client <#JohnZSmith>, <#BettyASmith>, <#JoanRSmith>, <#GlenWSmith>, <#AlfredESmith>. <#JohnZSmith> a foaf:Person; o:status o:ActiveCustomer; foaf:name "John Z. Smith". <#BettyASmith> a foaf:Person; o:status o:PreviousCustomer; foaf:name "Betty A. Smith". <#JoanRSmith> a foaf:Person; o:status o:PotentialCustomer; foaf:name "Joan R. Smith". <#GlenWSmith> a foaf:Person; o:status o:ActiveCustomer, o:GoldCustomer; foaf:name "Glen W. Smith". <#AlfredESmith> a foaf:Person; o:status o:ActiveCustomer, o:BronzeCustomer; foaf:name "Alfred E. Smith".
メモリーなどの実装上の限界に達することなくサーバーがその表現を作成できる程度に検索中の資源が小さく、クライアントがその表現を利用できる限り、このパターンはうまく機能します。実際のところ、これは間違いなくウェブにおける最も一般的なパターンです。
しかし、サーバーおよび/またはクライアントの制約や利用のプレファレンスが関わってきた時点で、他の何かが必要となります。LDPページングは、表現をより小さな断片に分割する性能をクライアントとサーバーに提供することでこのニーズに対応し、クライアントが必要な分だけ(資源の完全な状態の小さなサブセットの可能性がある)転送を行い、クライアントが断片を再構成したければできる(またはしない)ようにします。一般的な例としては、このパターンは、ページ検索の結果などの文脈でみられます。
可能性のある最もシンプルなソリューションは、既存のURIであるhttp://example.org/customer-relations
の意味を、「すべての顧客関係情報」から「すべての顧客関係情報の最初のサブセット」に定義しなおすことです。しかし、その場合には、元の定義を用いてコードを構築した既存のクライアントを変更する必要があるため、Example Co.が「最初のサブセット」のURIを新たに作成したうえで、その後のサブセットを発見する方法を定義し、この新しい「最初のサブセット」のURIをクライアントに使わせるという方法のほうが可能性が高いでしょう。
「最初のサブセット」のURIという方法では、既存のクライエントを、古い「すべて」から新しい「最初のサブセット」という意味へと移行するという課題が解決されるわけではありません。HTTPに反して、303
のリダイレクトに自動的に従い、リダイレクト先の資源を元の資源と等しいものとして扱うという、広く普及している従来のクライアントの慣行を前提としても、303 See Other
(「303 他を参照」)が、古いURIから新しいURIにリダイレクトさせることはありません。安全な方法は、リダイレクト先のURIの「最初のサブセット」の意味をクライアントが処理可能であることを、クライアントがサーバーに明示的に伝えることです。これが、LDPページングが行う内容です。
LDPページングに対応しているクライアントは、通常の方法で資源の表現を取得したうえで、先頭ページ資源へのリダイレクションを処理できる性能があることも伝えます。
リクエストGET /customer-relations HTTP/1.1 Host: example.org Accept: text/turtle Prefer: return=representation; max-triple-count="500"
下記のとおり、サーバーのレスポンスには303 See Other
のステータス・コードと、ターゲット資源を識別するLocation: http://example.org/customer-relations?page1
というHTTPレスポンス・ヘッダーが含まれています。
HTTP/1.1 303 See Other Location: <http://example.org/customer-relations?page1>
この時点では、クライアントは、ターゲット資源が「すべて」なのか「最初のサブセット」なのかを知りません。それを知るためには、資源を検索する必要があります。
リクエストGET /customer-relations?page1 HTTP/1.1 Host: example.org Accept: text/turtle Prefer: return=representation; max-triple-count="500"
サーバーのレスポンスは下記のとおりです。
レスポンス:HTTP/1.1 200 OK Content-Type: text/turtle ETag: "_87e52ce291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type", <http://www.w3.org/ns/ldp#Page>; rel="type" Link: <http://example.org/customer-relations?p=2>; rel="next" Link: <http://example.org/customer-relations>; rel="canonical"; etag="customer-relations-v1" Allow: GET,OPTIONS,HEAD @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix dcterms: <http://purl.org/dc/terms/>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. @base <http://example.org/customer-relations>. <> a o:CustomerRelations; dcterms:title "The customer information for Example Co."; o:client <#JohnZSmith>, <#BettyASmith>, <#JoanRSmith>. <#JohnZSmith> a foaf:Person; o:status o:ActiveCustomer; foaf:name "John Z. Smith". <#BettyASmith> a foaf:Person; o:status o:PreviousCustomer; foaf:name "Betty A. Smith". <#JoanRSmith> a foaf:Person; o:status o:PotentialCustomer; foaf:name "Joan R. Smith".
このレスポンスから、クライアントは、もっと多くのデータが存在しており、それがどこにあるかを知ることになります。サーバーは、クライアントのmax-triple-count
というプレファレンスを1つのインプットとして用いて、この仕様では定義していないアプリケーション固有の方法でページのサイズを決定します。最もシンプルな方法は、サーバーのページ・サイズをクライアントのプレファレンスと同じにすることです。この例では、2ページ目が存在するように、サーバーは、より小さい値を選択しています。
Link: <http://example.org/customer-relations>; rel="canonical"
というレスポンス・ヘッダーは、どの資源<http://example.org/customer-relations?page1>
がそのページなのかをクライアントに伝えます。etag="customer-relations-v1"
というパラメータ値は、ページのトラバース中に、規範的な(canonical)ページ付き資源が変更されたかどうかを知るための方法をクライアントに提供します。すべてのクライアントがこの情報を用いるわけではありませんが、これは、それを利用できるクライアントのために存在しています。Link: <http://www.w3.org/ns/ldp#Page>; rel="type"
というレスポンス・ヘッダーは、これが1つのシーケンス内ページ資源であることをクライアントに伝えます。したがって、サーバーがレスポンスを作成した時に、規範的なページ付き資源に、もっと多くのデータが存在しているかどうかを知るために、他のレスポンス・ヘッダーを調査する必要があります。Link: <http://example.org/customer-relations?p=2>; rel="next"
というレスポンス・ヘッダーは、少なくとももう1つのシーケンス内ページ資源が存在することと、その表現を検索する方法をクライアントに伝えます。次ページ・リンクのターゲットURIは、サーバーにより定義され、この仕様の制約を受けません。以下の例は、次ページを検索するためのメッセージ交換を示しています。
リクエストGET /customer-relations?p=2 HTTP/1.1 Host: example.org Accept: text/turtle Prefer: return=representation; max-triple-count="500"
サーバーのレスポンスは下記のとおりです。
レスポンス:HTTP/1.1 200 OK Content-Type: text/turtle ETag: "8_7e52ce291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type", <http://www.w3.org/ns/ldp#Page>; rel="type" Link: <http://example.org/customer-relations>; rel="canonical"; etag="customer-relations-v1" Allow: GET,OPTIONS,HEAD @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix dcterms: <http://purl.org/dc/terms/>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. @base <http://example.org/customer-relations>. <> o:client <#GlenWSmith>, <#AlfredESmith>. <#GlenWSmith> a foaf:Person; o:status o:ActiveCustomer, o:GoldCustomer; foaf:name "Glen W. Smith". <#AlfredESmith> a foaf:Person; o:status o:ActiveCustomer, o:BronzeCustomer; foaf:name "Alfred E. Smith".
この例では、2ページ目で提供された顧客は2人だけしかいませんでした。
Link: <http://www.w3.org/ns/ldp#Page>; rel="type"
というレスポンス・ヘッダーは、これが1つのシーケンス内ページ資源であることをクライアントに伝えます。したがって、サーバーがレスポンスを作成した時に、規範的なページ付き資源にもっと多くのデータが存在しているかどうかを知るために、他のレスポンス・ヘッダーを調査する必要があります。Link: <http://example.org/customer-relations?p=2>; rel="next"
というレスポンス・ヘッダーがない場合には、それは、レスポンスが作成された時にはこのページ付き資源にはシーケンス内ページ資源がそれ以上存在していなかったということをクライアントに伝えます。他のプロセスにより顧客関係データが更新された場合には、リクエストを繰り返すと、他のページへのリンクを持つ表現が発生するかもしれません。etag="customer-relations-v1"
のパラメータ値には変更がなかったため、統合されたレスポンス表現は、サーバーが1回の200 OK
ですべてのページ付き資源を提供した場合に受け取るものと同じであることが保証されます。クライアントは、ページ付き資源の現在の状態が、最後のページが作成されてから変更されていないという保証は得ていません。例えば、サーバーが最後のページ表現を構築した後に、別の人がサーバーからclient#BettyASmith
を削除する可能性もあります。この項の今までのすべてのページングの例では、複雑さを軽減するために、サーバーが前向きトラバースのみをサポートしていると仮定していました。サーバーは、ページ全体の後ろ向きトラバースや、任意のシーケンス内ページ資源から先頭ページ/最終ページへの直接的なアクセスもサポートしているかもしれません。これらのオプションは、下記のリンクの組み合わせ(または、それらと意味的に同等の構文バリエーション)をレスポンス・メッセージに追加することで反映されるでしょう。
Link: <>; rel="first" Link: <http://example.org/customer-relations?p=2>; rel="last"
Link: <http://example.org/customer-relations?page1>; rel="first" Link: <http://example.org/customer-relations?p=2>; rel="last"
Link: <http://example.org/customer-relations?page1>; rel="first" Link: <http://example.org/customer-relations?page1>; rel="prev" Link: <>; rel="last"
以下のすべては、LDPページング・クライアントの適合規則です。
非規範的な注: この想定は、例えば、ページ付き資源に変更が生じた時に、サーバーがシーケンスからページを削除する性能と衝突します。この1つの結果として、ページのリンクを辿った時に、単にタイミングの問題で、クライアントやサーバー側にまったくエラーが生じていないのに、クライアントが4xx
のステータス・コードのレスポンスを受け取ることがありえます。このようなレスポンスは異常であり、クライアントがそのページをトラバースしている間にページ付き資源の状態が変更されていないということもレスポンスが示していれば、おそらくエラーが発せられるでしょう。サーバーは特定のページ・シーケンスの有効期限を設定することもでき、サーバーがそのシーケンスを捨てた後にクライアントがリクエストを行えば、410 Gone
(「410 消滅」)やその他の4xx
のステータス・コードが発生する可能性が高いです。
303 See Other
(「303 他を参照」)のリダイレクト先を、元の資源の代替として扱ってはなりません(MUST NOT)。つまり、[RFC7231]で明確化されているとおり、303
ステータス・コードを、307 Temporary Redirect
(「307 一時的リダイレクト」)[RFC7231]や308 Permanent Redirect
(「308 恒久的リダイレクト」)[RFC7238]であるかのように扱うことはできません。LDPページング・サーバーがページングを開始する方法としてリダイレクションを用いる場合には、1つのシーケンス内ページ資源の表現とページ付き資源の表現とを区別するクライアントの性能にとってこれはクリティカルです。LDPページング・クライアントは、LDPページング・サーバーの選択に影響を及ぼすページングに関するヒントを提供しなければなりません。
この仕様では、HTTP Prefer
リクエスト・ヘッダーのreturn=representation
プレファレンス[RFC7240]に新しいパラメータを導入しており、これをクライアントが用いて、クライアントのニーズに最も適したレスポンスをサーバーが作成できるようなプレファレンスを提供できます。この項で定義しているパラメータがあると、いくつかの目的に役に立ちます。
GET
レスポンスを処理できるべきです(SHOULD)。LDPページングは、既存のHTTP Prefer
リクエスト・ヘッダーのreturn=representation
プレファレンス[RFC7240]に新しいパラメータとしてmax-triple-count
、max-member-count
、max-kbyte-count
を定義しています。プレファレンス単独ではなく、これらのパラメータのいずれかがプレファレンスに存在していれば、クライアントがLDPページングをサポートしていることをサーバーに示していることになります。クライアントは、以下のプレファレンスのパラメータのいずれかを含んだreturn=representation
プレファレンスを持つリクエスト・ヘッダーを追加してそのヒントをサーバーに伝えます。
max-triple-count |
クライアントが個々のページに表示したい最大トリプル数(10進数)。 |
max-kbyte-count |
クライアントがページの表現として受け取りたい最大キロバイト数(1024バイト単位)(10進数)。 |
max-member-count |
クライアントが個々のページに表示したい最大メンバー数(10進数)。このパラメータはページ付きLDPCsにのみ意味がある。 |
汎用プレファレンスであるBNF[RFC7240]では、プレファレンスのパラメータ値として引用符で囲まれた文字列やトークンが認められています。
1ページあたり最大500件のRDFトリプルを受け取ることに関心があるクライアントは、4.2項 リダイレクトを用いたシンプルなページングのフローで示しているとおり、GET
リクエストにこのHTTPヘッダー(Prefer: return=representation; max-triple-count="500"
)を追加するでしょう。
この項は非規範的です。
以前に説明したとおり、ページングは、ページ付き資源を、クライアントが検索可能なシーケンス内ページ資源(ページ)のリストに論理的に分割し、他のシーケンス内のページへのリンクを含んだ個々のページを提供します。クライアントは、他のページがあるかどうかを知るために、個々のレスポンスの調査を行います。ページングはHTTPステータス・コードの選択には影響しません。LDPCsのみに現在定義されている一部のケースでは、サーバーはそのアルゴリズムを示すことができますが、一般的にクライアントにはページへの情報の割り当てを見抜く力はありません。
クライアントが受け取った任意のシーケンス内ページ資源に変更が反映されたことをLDPページングは保証しないため、一部のクライアントは、ページの検索中に、競合するリクエストによってページ付き資源が変更されたかどうかを知ることに関心があるでしょう。サーバーの実装に関わらず、LDPは、一連のページをトラバースしている間に、リード・コミッテッド分離(read committed isolation)[READ-COMMITTED]を用いているデータベースと同等のデータをクライアントが観察することを保証するだけです。具体的に言うと、クライアントは、 LDPページング・サーバーが提供するページをトラバースしている間に、非再現リード(non-repeatable read)[NON-REPEATABLE-READS]を観察できます。しかし、LDPページングは、クライアントがページを検索しているすべての期間にわたってページ付き資源に(追加も削除されず)継続的に存在しているLDPRの情報が、少なくとも1つのシーケンス内ページ資源に存在していることは保証します。
LDPページングは、例えば、クライアントがページのトラバースをできる限り早く断念できるように、クライアントがページ付き資源の変更を検知できるメカニズムを定義しています。これは、場合によっては、ページ付きフィード[RFC5005]に対して記述されているものよりも強い保証を提供しますが、どのような時にその条件に当てはまるのかをクライアントが検出する必要があります。ページングは、ページ付き資源が追加または変更されることなく、すべてのシーケンス内ページ資源をうまく検索できることを決して保証しません。そのため、そのような保証を必要とするクライアントは、実際にはすべてのページ付き資源を使用できるわけではないことに気づくかもしれません。4.項 メッセージ交換のページングの例で詳細な例を提供しています。サーバー実装に関する留意点に関しては、A項 サーバー・サイド・セッションの状態を維持せずにLDPRsをページングを参照してください。
LDPRs[LDP]に対するHTTP GET
の要件に加え、LDPページング・サーバーは、すべてのページ付き資源および関連するシーケンス内ページ資源に関して、この項の要件にも従わなければなりません。
非規範的な注: LDPサーバーの実装者は、ここで定義しているパラメータがないPrefer return=representation
リクエスト・ヘッダーを、ページ付き資源に対するクライアントのリクエストであると解釈しないように注意すべきです。この仕様で定義しているプレファレンスのパラメータが少なくとも1つ存在する時にのみ、クライアントのヒントは、LDPページングのサポートを示します。
非規範的な注: LDPサーバーの実装者は、[RFC7240]の2項で記述しているとおり、これらのプレファレンスのキャッシュへの影響を慎重に考慮すべきです。
非規範的な注: [RFC7240]は、レスポンスの内容に基づくヒントの尊重に関して、クライアントが、サーバーの挙動を別の方法では決定できない時に、サーバー実装者がPreference-Applied
レスポンス・ヘッダーを含むことを推奨しています。
Request-URI
として用いて、成功したGET
リクエストに応答すべきです(SHOULD)。303 See Other
(「303 他を参照」)のステータス・コードと、最初のシーケンス内ページ資源を識別するLocation
レスポンス・ヘッダーで応答します。クライアントがページングを理解できることをクライアントがサーバーに伝えるためにLDPページングが定義している標準的な方法は、この目的のために定義されているクライアントのプレファレンスを用いるというもののみですが、その他の実装固有の方法も使用できるかもしれません。200 OK
)と、サイズが大きいかもしれないページ付けのない表現で応答します。4xx
のステータス・コードの可能性が最も高い)か、(下記の注に留意しつつ)上記のとおりに303
のステータ・スコードでページングを開始するか、特定の状況に適した別のステータス・コードを選択するかのいずれかを行います。非規範的な注: LDPページング・サーバーは、任意の資源をページ付き資源としてしか利用できないようにすることを選択できます。これを行った場合には、LDPページングを理解できないクライアントとの相互作用において、とりあえずサーバーがページングを開始すれば、不正な挙動を取るクライアントは、303 See Other
(「303 他を参照」)リダイレクトに自動的に従ってしまい、その後の200 OK
により、1つのシーケンス内ページ資源の表現ではなく、完全なページ付き資源を得たと信じてしまうリスクがあります。LDPページング・クライアントは、このような方法でリダイレクトに従うことはありませんが、一部の既存のHTTPクライアントは、[RFC7231]で明示的に否定されているにもかかわらず、303 See Other
(「303 他を参照」)リダイレクトを元のrequest-URIと同じであるかのように扱うことが知られています。
非規範的な注: 結果として、ページ付き資源がトラバース中にまったく変更されなければ、クライアントは、最後のページが検索された時点で交渉を行ったレスポンス・メディア・タイプが提供する状態を完全に把握していることになります。トラバース中にページ付き資源に変更が行われれば、実際に更新された部分のみが異なるでしょう。この場合に、サーバーのものとどのように異なっているのかを知る(LDPページングに規定されている)手段はクライアントにはありません。
非規範的な注: ページ付き資源がLDP-RSである場合には、ページ付き資源への変更が反映されていないすべてのトリプルが、トラバース中にクライアントに提供されたと推測されます。変更されたトリプルのサブセットの一部(すべての場合も、まったくない場合もある)がクライアントに提供された可能性もありますが、クライアントには、それがどれなのかを知る術はありません。
GET
レスポンスにHTTP Link
ヘッダーを含むことにより、クライアントがページを検索している間に発生するページ付き資源に対するあらゆる変更をクライアントが検出できるようにしなければならず(MUST)、すべての4xx
ステータ・スコード・レスポンスに同じヘッダーを含むべきです(SHOULD)。リンクのコンテキストURIは、検索されているシーケンス内ページ資源を識別し、ターゲットURIは、ページ付き資源を識別し、リンク関係型は、canonical
[REL-CANONICAL]であり、リンク拡張パラメータには、パラメータ名etag
と、ページ付き資源のETag[RFC7232]と全く同じ対応するパラメータ値が含まれます。例:Link: <http://example.org/customer-relations>; rel="canonical"; etag="customer-relations-v1"
非規範的な注: 例えば、先頭ページの表現に伴う値がrel="canonical"; etag="v1"
、2ページ目の表現に伴う値がrel="canonical"; etag="v2"
というように、クライアントがページを検索するにつれてrel="canonical"; etag="..."
の値が変更されれば、クライアントは、ページ付き資源の状態が変更されたことを検出できます。このような変更を無視するクライアントもありますが、トラバースを再開するなどの方法でそれらに対応することを選択することもできます。
非規範的な注: サーバーが適切な既存のページにコンテンツを追加するか、シーケンス内の適切な場所に新しいページを追加するかのどちらかを行えば、クライアントにとってはそれほど破壊的ではありませんが、サーバーが順序付けされたページ・シーケンスを捨てるかもしれず、その場合には結果として、その後のリクエストに4xx
のステータス・コードが生じます。クライアントが変更/追加されたページを検出するためには、既存ページに条件付き検索リクエストを行う以外に有効な方法はありません。
非規範的な注: 結果として、クライアントがシーケンス内ページ資源の検索を何度か行えば、ページ付き資源の状態が変わるとシーケンス内のその場所も変わることに気づくかもしれません。例えば、形式的には、後でページが再検索されたときに、最終ページのサーバーは、次ページ・リンクを提供するかもしれません。ページ・シーケンスが、複数のサーバーにまたがる時にも、同じような状況が発生します。サーバーAは、シーケンスの最初の部分を提供し、それはサーバーAが知っている最終ページ(サーバーBで提供される)にリンクされていて、サーバーBがページのシーケンスを拡張するかもしれません。Mという中間ページは、クライアントがMを検索した後に、競合するリクエストが、ページ付き資源の内容の一部を削除すれば、形式的には、最終(または、存在しない)ページになることがありえます。
Request-URI
として持つリクエストに応答する時に、先頭ページ・リンクを提供できます(MAY)。Request-URI
として持つGET
リクエストに応答し、最終ページ・リンクを提供できます(MAY)。Request-URI
として持つGET
リクエストに応答し、次ページ・リンクを提供しなければなりません(MUST)。これは、クライアントが次ページのURLを発見できるメカニズムです。Request-URI
として持つGET
リクエストに応答し、次ページ・リンクを提供してはなりません(MUST NOT)。これは、サーバーが現在認識しているページ・シーケンスの終わりをクライアントが発見できるメカニズムです。Request-URI
として持つGET
リクエストに応答し、前ページ・リンクを提供できます(MAY)。これは、クライアントが前ページのURLを発見できる1つのメカニズムです。Request-URI
として持つGET
リクエストに応答し、前ページ・リンクを提供してはなりません(MUST NOT)。これは、サーバーが現在認識しているページ・シーケンスの始まりをクライアントが発見できる1つのメカニズムです。Request-URI
として持つGET
リクエストに応答し、ターゲットURIがhttp://www.w3.org/ns/ldp#Page
で、リンク関係型がtype
[RFC5988]であるHTTP Link
ヘッダーを提供しなければなりません(MUST)。これは、資源がページのシーケンスの1つであることをクライアントが知る1つのメカニズムです。410 Gone
(「410 消滅」)で応答することにより、シーケンスを捨てたことを示すべきです(SHOULD)。max-triple-count
というクライアント・プレファレンス・パラメータをサポートすべきで(SHOULD)、これは、1ページに表示されるRDFトリプルの数を制限するページ・サイズを表します。例えば、max-triple-count="500"
は、1ページあたり500のRDFのトリプルという制限を表します。max-kbyte-count
というクライアント・プレファレンス・パラメータをサポートすべきで(SHOULD)、これは、ページ・サイズの制限を表示サイズのキロバイトで表します。例えば、max-kbyte-count="1"
は、1ページあたり1024バイトという制限を表します。max-kbyte-count="1"
とmax-triple-count="500"
の結果は、個々のトリプルが2バイト以上を必要とする可能性が非常に高いため、通常、サイズが1キロバイトという制限とそもそも衝突するページになります(500トリプル/1024バイト)。max-member-count
というクライアント・プレファレンス・パラメータをサポートすべきで(SHOULD)、これは、ページ付きLDPCの個々のページで返されるメンバーの数を制限するページ・サイズを表します。例えば、max-member-count="10"
は、1ページあたり10のメンバーという制限を表します。この項は非規範的です。
コンテナのメンバーの順序が重要な場合が多くあります。あらゆるクライアントは、入手できるメンバーのプロパティー値に基づいて、好きなようにメンバーを選択して順序付けできるため、[LDP]は、コンテナ内のサーバーのメンバーの順序付けに関して特別なサポートを行いません。下の例では、メンバーごとにo:marketValue
という述語の値が存在しているため、クライアントはそのプロパティー値に従ってメンバーを容易に順序付けできます。順序を指定する方法をクライアントに要求するアプリケーションは、アプリケーション固有の拡張でそれを行うことができます。
コンテナがページ付けされている場合には、順序がより重要になります。ページの構成時にサーバーが順序を尊重すれば、全体的にソートされたメンバーが必要なクライアントは、ページの統合に必要な労力を削減できます。順序が重要な場合には、LDPページング・サーバーは、任意の1ページ内のすべてのメンバーに、次ページおよび前ページのすべてのメンバーに関連付けられた適切なソート順序が含まれていることを保証します。これは、1ページ内のメンバーの順序については何も語りません。ソートが昇順の時には、現在のページのすべてのメンバーのソート順序は、前ページのすべてのメンバーよりも大きく、次ページのすべてのメンバーよりも小さいです。つまり、小さいものから大きいものへと進みますが、いくつかの連続するページには、ソートの基準が等しいメンバーがありえます。ソートが降順の時には、順序は逆になります。メンバーのソートには複数の値が用いられうるため、LDPCの仕様では、サーバーは、ldp:pageSequence
というHTTPリンク関係とそのldp:pageSortCriteria
述語を用いて、メンバーのソートに用いる順序付けされたソート基準のリストを言明できます。この順序付けされたリストの個々のメンバーは、1つのldp:pageSortCriterion
を提供し、これは、ldp:pageSortOrder
、ldp:pageSortPredicate
、オプションのldp:pageSortCollation
で構成されます。
以下に、[LDP]の5.1項で説明している財産コンテナの例を示します。
リクエストGET /netWorth/nw1/assetContainer/ HTTP/1.1 Host: example.org Accept: text/turtle Prefer: return=representation; max-triple-count="500"
サーバーは、ステータス・コード200 OK
と、次の表現で応答するかもしれません。
HTTP/1.1 200 OK Content-Type: text/turtle ETag: "_87e52ff291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type" Link: <http://www.w3.org/ns/ldp#DirectContainer>; rel="type" Allow: GET,OPTIONS,HEAD # The following is the ordered representation of # http://example.org/netWorth/nw1/assetContainer/ # @base <http://example.org/netWorth/nw1/assetContainer/> . @prefix dcterms: <http://purl.org/dc/terms/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. <> a ldp:DirectContainer; dcterms:title "The assets of JohnZSmith"; ldp:membershipResource <http://example.org/netWorth/nw1>; ldp:hasMemberRelation o:asset; ldp:insertedContentRelation ldp:MemberSubject; ldp:contains <a1>, <a2>, <a3>. <http://example.org/netWorth/nw1> a o:NetWorth; o:asset <a1>, <a3>, <a2>. <a1> a o:Stock; o:marketValue 100.00 . <a2> a o:Cash; o:marketValue 505.00 . <a3> a o:RealEstateHolding; o:marketValue 100.00 .
HTTPステータス・コードが200 OK
であるため、レスポンスの作成にLDPページングが用いられなかったことをクライアントは知っています。Link: <http://www.w3.org/ns/ldp#Page>; rel="type"
というレスポンス・ヘッダーリンクがなければ、この確認は冗長になります。ページングが用いられなかったため、サーバーは、ページのソートに関する情報を提供しません。ページのソートに関する情報の提供は、クライアントには価値がなく、資源の浪費にすぎません。
代わりに、サーバーが、http://example.org/netWorth/nw1/assetContainer/?p=1
という先頭ページへのリダイレクトで応答すれば、(リダイレクトに従った後は)次のとおりになります。
HTTP/1.1 200 OK Content-Type: text/turtle ETag: "_87e52ff291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type", <http://www.w3.org/ns/ldp#Page>; rel="type" Link: <http://example.org/netWorth/nw1/assetContainer/?p=2>; rel="next" Link: <http://example.org/netWorth/nw1/assetContainer/>; rel="canonical"; etag="v1" Link: <http://example.org/netWorth/nw1/assetContainer/sortedSequence/>; rel="http://www.w3.org/ns/ldp#pageSequence"Allow: GET,OPTIONS,HEAD # The following is the ordered representation of # http://example.org/netWorth/nw1/assetContainer/ page 1 of 2 @base <http://example.org/netWorth/nw1/assetContainer/> . @prefix dcterms: <http://purl.org/dc/terms/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. <> a ldp:DirectContainer; dcterms:title "The assets of JohnZSmith"; ldp:membershipResource <http://example.org/netWorth/nw1>; ldp:hasMemberRelation o:asset; ldp:insertedContentRelation ldp:MemberSubject; ldp:contains <a1>, <a2>, <a3>. <http://example.org/netWorth/nw1> a o:NetWorth; o:asset <a1>, <a3>, <a2>. <a1> a o:Stock; o:marketValue 100.00 . # The remainder of the content describes the sort order. # Note that the new base URI here matches the target URI of the pageSequence Link header above. @base <http://example.org/netWorth/nw1/assetContainer/sortedSequence/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. <> ldp:pageSortCriteria ( <#Sort-o.marketValue-Ascending> ). <#Sort-o.marketValue-Ascending> a ldp:pageSortCriterion; ldp:pageSortOrder ldp:Ascending; ldp:pageSortPredicate o:marketValue.
この場合、サーバーは、ページへのメンバーの割り当てに関する情報を提供します。
Link: rel="http://www.w3.org/ns/ldp#pageSequence"
というレスポンス・ヘッダーが追加され、クライアントはページ・シーケンスに関する情報がどこにあるかを知ることができます。その内容にはldp:pageSortCriteria
トリプルが含まれており、クライアントは、ページにメンバーを割り当てる時にサーバーがどのようなソート基準を用いたかを知ることができます。@base
指示子の後に出現するトリプル)。これはオプションの模範的な最適化であり、クライアントは、LDPやHTTPではない方法を用いて、それらの言明を信用するかどうかを独自に決定しければなりません。クライアントがそれらの言明を信用する場合には、それらを検索する必要はありません。このケースでは、それらを検索すると、別のHTTP GET
リクエストが生じるでしょう。この例では、言明は、クライアントがそれらを自身で検索して得るものと一致していると想定されます。o:marketValue
述語が用いられていることを言明します。サーバーは、先頭ページのすべての財産のo:marketValue
の値が、その後のページの値よりも大きいとクライアントに伝えています。偶然そのような値が1つだけ先頭ページにあるため、これが満たされていることは自明的です。クライアントが、rel="next"
のリンクを辿り、2ページ目を検索した場合には、その表現は次のとおりになるかもしれません。
HTTP/1.1 200 OK Content-Type: text/turtle ETag: "_87e52ff291112" Link: <http://www.w3.org/ns/ldp#Resource>; rel="type", <http://www.w3.org/ns/ldp#Page>; rel="type" Link: <http://example.org/netWorth/nw1/assetContainer/?pageSortOrder>; rel="prev" Link: <http://example.org/netWorth/nw1/assetContainer/>; rel="canonical"; etag="v1" Link: <http://example.org/netWorth/nw1/assetContainer/sortedSequence/>; rel="http://www.w3.org/ns/ldp#pageSequence" Allow: GET,OPTIONS,HEAD # The following is the ordered representation of # http://example.org/netWorth/nw1/assetContainer/ page 2 of 2 @base <http://example.org/netWorth/nw1/assetContainer/> . @prefix dcterms: <http://purl.org/dc/terms/>. @prefix ldp: <http://www.w3.org/ns/ldp#>. @prefix o: <http://example.org/ontology/>. <a2> a o:Cash; o:marketValue 505.00 . <a3> a o:RealEstateHolding; o:marketValue 100.00 .
Link: rel="http://www.w3.org/ns/ldp#pageSequence"
という同じレスポンス・ヘッダーが存在しており、それにより、クライアントは、サーバーが用いているページ・シーケンスが何なのか、ゆえに、ソート基準が何なのかを知ることができます。o:marketValue
の値は、以前のページの値よりも大きいか等しいです。このページ内の値は、ソート基準に従って順序付けされておらず、それは、この基準が、1ページ内の順序付けに当てはまるのではなく、「複数のページにメンバーを割り当てる」ソートにのみ当てはまることを示します。一般的に、それらの表現は、順序付けを保障せず、ライブラリにより生成され、そのシリアライザは、順序付けの伝達方法をコントロールする方法を提供しません。1ページ内の(または、全体的な)資源の順序を示すための適切な述語の決定は、ドメイン・モデルとサーバー次第であり、例えば、ユーザ・インターフェースの表示前にデータをソートする場合などに、そのニーズを満たすために適切な方法でその順序を用いることは、この表現を受け取るクライアント次第です。また、コンテナは、他のコンテナを自身のメンバーとして持つことができるため、コンテナ自身がLDPRsであり、ドメイン・モデルのプロパティーをソート基準に利用できるので、順序付けのアプローチは変わりません。
LDPページング・サーバーが、LDPCメンバーをページに割り当てるために用いる順序をクライアントに伝えるために、LDPページングで定義されているメカニズムを用いることを選択した場合(これはオプションです)、それはこの項で説明しているとおりに行われます。LDPページングは、その他のケースでは、ページに対する順序付けについて規定していません。模範的なメッセージ交換に関しては、7.2.1項 順序付けを参照してください。
非規範的な注: サーバーは、同じページ付き資源に異なるシーケンス(例えば、異なるソート基準を持つシーケンス)を提供でき、それらは、順次または同時に提供できます。
http://www.w3.org/ns/ldp#pageSequence
、ターゲットIRIがコンテンツにソート基準を含んでいるLDP-RSを識別するHTTP Link
ヘッダーを用いて順序を指定しなければなりません(MUST)。Link
ヘッダーのターゲットIRIで識別される資源には、主語がLink
ヘッダーのターゲットIRI、述語がldp:pageSortCriteria
、目的語がそのコンテンツに関するこの項の要件に準拠したページ・ソート基準の資源であるトリプルが含まれていなければなりません(MUST)。ldp:pageSortCriterion
資源のrdf:List
で構成されます。最初のリストのエントリーは最初のソート基準を提供し、2番目のエントリーは最初の基準に照らして等しいと考えられるメンバーの順序付けを行うために用いられる2番目の基準を提供するなどと続きます。結果として作成されるページ・ソート順序は、SPARQL SELECT
のORDER BY
句[sparql11-query]で定義されているとおりでなければなりません(MUST)。ldp:pageSortCriterion
リストのエントリーにおいて、主語がソート基準の識別子、述語がldp:pageSortPredicate
、目的語がページ間のメンバーを順序付けるために値が用いられる述語(ページ順序値)であるトリプルが含まれているページ・ソート基準の資源を提供しなければなりません(MUST)。LDPが挙動を制約するリテラルのデータ型は、SPARQL SELECT
のORDER BY
句[sparql11-query]で定義されているもののみです。その他のデータ型を用いることはできますが、LDPはそれらに意味を割り当てず、相互運用性が制限されるでしょう。ldp:pageSortCriterion
リストのエントリーにおいて、主語がソート基準の識別子、述語がldp:pageSortOrder
、目的語が用いられている順序を記述しているトリプルが含まれているページ・ソート基準の資源を提供しなければなりません(MUST)。LDPは、このトリプルの目的語として用いるために
ldp:Ascending
とldp:Descending
の2つの値を定義しています。その他の値を用いることはできますが、LDPはそれらに意味を割り当てず、相互運用性が制限されるでしょう。
ldp:pageSortCriterion
リストのエントリーにおいて、主語がソート基準の識別子、述語がldp:pageSortCollation
、目的語が用いられている照合順序(collation)を識別しているトリプルが含まれているページ・ソート基準の資源を提供できます(MAY)。[sparql11-query]が照合順序を用いないページ順序値が比較に含まれている場合は、ldp:pageSortCollation
トリプルを省略しなければなりません(MUST)。LDP は、このトリプルの目的語として用いる値を定義していません。相互運用性のためには、オープンな標準化された値を用いる方が良いですが、いかなる値でも使用できます。
ldp:pageSortCollation
トリプルがなく、ページ順序値が文字列またはシンプルなリテラル[sparql11-query]である場合、結果として作成される順序は、2つの引数の(two-argument)fn:compare
を用いたSPARQLSELECT
のORDER BY
句[sparql11-query]で定義されているとおりです。つまり、それは、http://www.w3.org/2005/xpath-functions/collation/codepoint
が指定された照合順序であるかのような挙動を行います。
ldp:pageSortCollation
が存在し、ページ順序値が文字列またはシンプルなリテラル[sparql11-query]である場合、結果として作成される順序は、3つの引数の(three-argument)fn:compare
を使いたSPARQLSELECT
のORDER BY
句[sparql11-query]で定義されているとおりです。つまり、それは、規定されている照合順序です。
この項は非規範的です。
HTTPを用いて実装されているプロトコルと同様に、実装においては、関連する多くのセキュリティ関連機能を利用すべきであり、その代わりに特定のセキュリティ方針とは対照的でありえるLDPオペレーションを実行する必要はありません。システム上重要なRDFステートメントをPUTメソッドによってグラフに置き換えるなどの、非認証要求に直面した時には、アプリケーションは、401のステータ・スコード(承認なし)で応答し、適切な承認が必要であることを示すことを検討できます。認証が特定のアクセス・コントロール方針の要件を満たすことに失敗した場合には、アクセス・コントロール方針を満たせなかったことを示すために、403のステータス・コード(アクセス拒否)をクライアントに返信できます。この項は非規範的です。
クライアントごとの状態が暗示するスケーラビリティ上の制限のために、クライアントごとの状態を維持することを期待された場合には、当然ながらサーバーの実装者は懸念を持ちます。一見したところでは明白ではないかもしれませんが、LDPページングにはそのような要件はありません。クライアント[WEBARCH]にとってURLは曖昧であるため、サーバーは、例えば、その次ページ・リンク内のどこで次ページを始めるべきかを知るために必要な情報を自由にエンコードできます。
以前の例では、page n URLはすべてhttp://example.org/customer-relations?p=n
という形式であることに注目してください。なお、このとき、nは2..nです。これは、一般的な慣習では真(true)である可能性が高いです。サーバーがページにo:client
表現をランダムに割り当てれば、少なくとも1つのページですべての表現を送信している間に、クライアントごとの何らかの状態をサーバーに保持することを回避する方法は明確ではありません。しかし、リストが順序付けされている(自然な順序、または、実装により課された順序のどちらでも)という一般的なケースであれば、クライアントごとの状態をサーバーに保持することを回避するのは簡単です。
1つの簡単な例は「固定順序」です。サーバーが、o:client
表現を常に#JohnZSmith, #BettyASmith, #JoanRSmith, #GlenWSmith, #AlfredESmith
の順序(または、任意の予測可能な順序)で送信すれば、個々のクライアントが検索した時に、個々のシーケンス内ページ資源の次ページ・リンクに「last seen」という識別子を挿入できます。実際には、「セッションの状態」はクライアントにより保持されます。このケースでは、先頭ページ内の次ページ・リンクは次のようなものでありえます。
Link: <http://example.org/customer-relations?resumeafter=JoanRSmith>; rel="next"
サーバーが後ろ向きトラバースもサポートしていれば、2ページ目の前ページ・リンクは次のようなものでありえます。
Link: <http://example.org/customer-relations?resumebefore=GlenWSmith>; rel="next"
これが模範的なサーバーの実装決定事項であることに留意してください。これは、LDPページングでは規定されておらず、他の選択ももちろん可能です。リンクに用いられるURIがクライアントにとって曖昧である限り、規範的な参考文献の制約の範囲内で任意の選択が許されています。
この項は非規範的です。
この仕様の作成において、次の方々に、アイデア、フィードバック、レビュー、コンテンツ、批評およびインプットの提供でご協力いただきました。
Arnaud Le Hors(議長)、Alexandre Bertails、Andrei Sambra、Andy Seaborne、Antonis Loizou、Ashok Malhotra、Bart van Leeuwen、Cody Burleson、David Wood、Eric Prud'hommeaux、Erik Wilde、Gregory McFall、Henry Story、John Arwe、Kevin Page、Kingsley Idehen、Mark Baker、Martin P. Nally、Miel Vander Sande、Miguel Esteban Gutierrez、Nandana Mihindukulasooriya、Olivier Berger、Pierre-Antoine Champin、Raul Garcia Castro、Reza B'Far、Richard Cyganiak、Roger Menday、Ruben Verborgh、Sandro Hawke、Serena Villata、Sergio Fernandez、Steve Battle、Steve Speicher、Ted Thibodeau、Tim Berners-Lee、Yves Lafon
この項は非規範的です。
要約2NN Contents of Related
のステータス・コードと用法に対する「リスクがある機能」の内容を削除しました。