API ページネーションのベストプラクティス 質問する

API ページネーションのベストプラクティス 質問する

私が構築しているページ分割された API の奇妙なエッジケースを処理するのに助けが欲しいです。

多くの API と同様に、この API は大きな結果をページ分けします。/foos をクエリすると、100 件の結果 (つまり、foo #1-100) と、foo #101-200 を返す /foos?page=2 へのリンクが返されます。

残念ながら、API コンシューマーが次のクエリを実行する前に foo #10 がデータ セットから削除されると、/foos?page=2 は 100 だけオフセットされ、foos #102-201 が返されます。

これは、すべての foo をプルしようとしている API コンシューマーにとって問題です。foo #101 を受信できないからです。

これを処理するベスト プラクティスは何ですか? できるだけ軽量にしたいと考えています (つまり、API リクエストのセッション処理を回避します)。他の API の例があれば、ぜひ教えてください。

ベストアンサー1

データがどのように処理されるかは完全にはわかりませんので、これが機能するかどうかはわかりませんが、タイムスタンプ フィールドを使用してページ分割することを検討しましたか?

/foos をクエリすると、100 件の結果が返されます。API は次のような結果を返すはずです (JSON を想定していますが、XML が必要な場合も同じ原則に従うことができます)。

{
    "data" : [
        {  data item 1 with all relevant fields    },
        {  data item 2   },
        ...
        {  data item 100 }
    ],
    "paging":  {
        "previous":  "http://api.example.com/foo?since=TIMESTAMP1" 
        "next":  "http://api.example.com/foo?since=TIMESTAMP2"
    }

}

注意: タイムスタンプを 1 つだけ使用すると、結果に暗黙の「制限」が適用されます。明示的な制限を追加するか、プロパティを使用することをお勧めしますuntil

タイムスタンプはリストの最後のデータ項目を使って動的に決定されます。これはFacebookのページ分割の仕組みとほぼ同じです。グラフAPI(一番下までスクロールすると、上記で示した形式のページネーション リンクが表示されます)。

1 つの問題は、データ項目を追加する場合に発生する可能性がありますが、説明に基づくと、それらは最後に追加されるようです (そうでない場合は、お知らせください。改善できるかどうかを確認します)。

おすすめ記事