1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでnextPageTokenのあるAPIを叩く

Posted at

Directory APIを使おうとしたらnextPageTokenなるものが出てきて扱いに困ったのですが、わりと当たり前な存在らしいので自分用の備忘録として残しておきます。

nextPageTokenについて

大量のデータを扱うAPIは取得上限が設けられており、1度に全てのデータを取ってくることができないようになっている。
そういったAPIは返り値にnextPageTokenというものがあり、これをリクエストパラメータに含むことで続きのデータを取得できるようになる。
続きのデータが無くなるとnextPageTokenも発行されなくなる。

例えば
データ取得上限が50のポケモンのデータを返すAPIがあったとすると…

リクエスト「ポケモンのデータを図鑑No順に全部くれ」
↓
レスポンス「ポケモンのデータ1~50とnextPageToken:Aをあげます」
↓
リクエスト「ポケモンのデータを図鑑No順に全部くれ + nextPageToken:A」
↓
レスポンス「ポケモンのデータ51~100とnextPageToken:Bをあげます」
↓
リクエスト「ポケモンのデータを図鑑No順に全部くれ + nextPageToken:B」
↓
繰り返す…

という感じ

Pythonにおけるdo while構文の代替

データ取得と言えばループ。
「nextPageTokenが発行されなくなったらループを抜ける」という処理は、他の言語であればdo while構文(1回は必ず処理を実行し、whileの条件を満たす場合繰り返す)を使えば良いが、Pythonにはdo while構文がない。
do while構文の代替としては、while Trueとbreakを組み合わせることで実現ができた。

基本的な使い方

このコードの53行目以降の処理をnextPageToken使用verに書き換えてみました。
こんな感じで書けば全データを取ってくることができます。

quickstart.py
# Call the Admin SDK Directory API
users = []
nextPageToken = ''

while True:
    results = service.users().list(
        customer='my_customer',
        maxResults=10,
        orderBy='email',
        pageToken=nextPageToken
    ).execute()
    users += results.get('users', [])
    nextPageToken = results.get('nextPageToken', [])
    # nextPageTokenが発行されなくなったら離脱
    if not nextPageToken:
        break

おわりに

nextPageTokenもPythonのdo whileも自分が困ったところなのでこの記事に辿り着いた方のお役に立てればと思います。
あと、Pythonはわかりやすさ(読みやすさ)を追求してる言語っぽいのでdo whileが無いのも意外と理にかなってるのかもしれませんね…。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?