imu-note
いむたろ
いむたろ
@imutaroh
新卒エンジニア / データ基盤 × AI

What — 一覧APIは全件を返さない

ページネーションは、一覧APIが結果を決まった件数ずつ区切って返す仕組み。 何万件ものデータを1レスポンスに詰めるとサーバーも通信も耐えられないので、「どこから・何件」をクエリパラメータで指定させる。

方式は2つあり、どちらを使うかはAPI提供側が決める。利用者に選択権はなく、ドキュメントとレスポンスを見て読み分ける。

方式パラメータの見た目次のページの取り方
offset型?page=2&per_page=30?limit=30&offset=60ページ番号・開始位置を自分で増やす
cursor型?cursor=eyJpZCI6...?after=abc123レスポンスに入っている「しおり」をそのまま次のリクエストに渡す

判定基準はレスポンスの中身nextcursor のトークンが返ってくれば cursor型、無ければ番号を自分で計算する offset型。

How — 終了条件までがワンセット

GitHub の Issue 一覧を2ページ目から30件取る例(offset型)。

curl "https://api.github.com/repos/golang/go/issues?per_page=30&page=2"

全件が欲しいときはループになる。止まる条件は2つだけ。

  • 空配列が返ってきたら終わり(offset型)
  • 次のしおりが返ってこなくなったら終わり(cursor型)

落とし穴

  • 1回のレスポンスで全件来ていると思い込む。多くのAPIはパラメータ無指定でも黙って30件などに切っている。「なぜか件数が足りない」の原因はたいていこれ
  • offset型はループ中のデータ増減でページがズレる。取得中に先頭へ1件増えると、次ページに同じものが重複して現れたり、1件取りこぼしたりする。このズレを「しおり」で防ぐのが cursor型が生まれた理由

関連