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に書き換えてみました。
こんな感じで書けば全データを取ってくることができます。
# 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が無いのも意外と理にかなってるのかもしれませんね…。