1. ホーム
  2. rest

[解決済み】API paginationのベストプラクティス

2022-03-27 10:20:26

質問

私が構築しているページ分割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からの例は非常にありがたいです

どのように解決するのですか?

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

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 (下にスクロールすると、上にあげた形式のページネーションリンクが表示されます)。

一つ問題があるとすれば、データ項目を追加した場合ですが、あなたの説明からすると、最後に追加されるようです(もしそうでなければ、教えてください、改善できるかどうか検討します)。