私は最近、このおよび他のRESTページング関連の質問についていくつかの広範な研究を行っており、ここに私の発見のいくつかを追加することは建設的だと思いました。私はページングについての考えとそれらが密接に関連しているのでカウントを含めるように質問を少し広げています。
ヘッダー
ページングメタデータは、応答ヘッダーの形式で応答に含まれます。このアプローチの大きな利点は、応答ペイロード自体が、要求者が要求していた実際のデータに過ぎないことです。ページング情報に関心のないクライアントが応答を処理しやすくします。
合計数などのページング関連情報を返すために、実際に使用されている一連の(標準およびカスタム)ヘッダーがあります。
X合計数
X-Total-Count: 234
これは、私が実際に見つけたいくつかの APIで使用されています。このヘッダーのサポートをループバックなどに追加するためのNPMパッケージもあります。一部の記事では、このヘッダーの設定も推奨しています。
多くの場合、Link
ヘッダーと組み合わせて使用されます。これはページングにはかなり良いソリューションですが、合計カウント情報が不足しています。
リンク
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
私は、一般的なコンセンサスが使用することを、このテーマに多くのことを読んでから、感じLink
ヘッダを使用してクライアントにページングリンクを提供するためにrel=next
、rel=previous
その他これに伴う問題は、それがある、がありますどのように多くの合計レコードの情報が欠けているということです多くのAPIがこれをX-Total-Count
ヘッダーと組み合わせる理由。
または、一部のAPIやJsonApi標準などはLink
形式を使用しますが、情報をヘッダーではなく応答エンベロープに追加します。これにより、メタデータへのアクセスが簡素化され(および合計カウント情報を追加する場所が作成されます)、実際のデータ自体に(エンベロープを追加することにより)アクセスする複雑さが増します。
コンテンツ範囲
Content-Range: items 0-49/234
Rangeヘッダーというブログ記事で宣伝されているので、私は(ページネーションのために)あなたを選びます!。著者は、ページ分割にRange
and Content-Range
ヘッダーを使用することを強く主張します。これらのヘッダーの RFCを注意深く読むと、バイトの範囲を超えてそれらの意味を拡張することは実際にはRFCによって予期されていて、明示的に許可されていることがわかります。のitems
代わりにのコンテキストで使用した場合bytes
、Rangeヘッダーは実際に、特定の範囲のアイテムを要求する方法と、応答アイテムが関連する合計結果の範囲を示す方法の両方を提供します。このヘッダーは、合計数を表示する優れた方法も提供します。そして、それは主に1対1をページングにマップする真の標準です。野生でも使用されます。
封筒
私たちのお気に入りのQ&A Webサイトからのものを含む多くのAPIは、データに関するメタ情報を追加するために使用されるデータのラッパーであるエンベロープを使用します。また、ODataおよびJsonApi標準はどちらも応答エンベロープを使用します。
これ(imho)の大きな欠点は、実際のデータがエンベロープのどこかにある必要があるため、応答データの処理がより複雑になることです。また、そのエンベロープにはさまざまな形式があり、適切な形式を使用する必要があります。これは、ODataとJsonApiからの応答エンベロープが大きく異なり、ODataが応答の複数のポイントでメタデータを混合していることを示しています。
別のエンドポイント
これは他の回答で十分カバーされていると思います。複数のタイプのエンドポイントがあるため、これは混乱を招くというコメントに同意するため、これについてはあまり調査しませんでした。すべてのエンドポイントがリソースの(コレクション)を表すのが最も良いと思います。
さらなる考え
応答に関連するページングメタ情報を伝達するだけでなく、クライアントが特定のページ/範囲をリクエストできるようにする必要もあります。この側面も見て、まとまりのある解決策が得られるのは興味深いことです。ここでも、ヘッダー(Range
ヘッダーは非常に適しているようです)、またはクエリパラメーターなどの他のメカニズムを使用できます。一部の人々は、いくつかのユースケース(例では意味をなさない可能性がある、別々のリソースとして結果のページを処理することを提唱/books/231/pages/52
、私のような頻繁に使用されるリクエストパラメータの野生の範囲を選択することになった。pagesize
、page[size]
およびlimit
サポートに加え、などRange
のヘッダを(とリクエストパラメータとして同じように)。