getCatalogItemにおけるpageTokenとページネーションの概括
どうもこんにちは。
Amazonのselling partner api (SP-API)で商品をキーワード検索をするときgetCatalogItemというオペレーションを使います。
このオペレーションでは性質上キーワードに合致したASINを複数返してくれます。
このとき、一度に1000などの結果が出ることもあるのですが、それを一度に表示するのは不可能です。
なので1回の検索で表示する数を限定する必要があります。
ASINやISBNなどを使って検索をするときには基本的には一つのASINが返ってくるだけなのでこのような問題は生じません。
このgetCatalogItemというオペレーションでは一度に20個まで取得できる数を指定することができます。
それはpageSizeというクエリ(query)を指定して行います。
例えば、結果が100個あったとするとそのうちの最初の20個の結果を表示できるということです。
では、残りの80個はどうするか?
ここでページネーションの問題が出てきます。
ページネーションはグーグル検索などでよく見る「次のページ」といったものですね。
で、次の20個の結果を得るにはそのためのパラメーターをクエリに指定しなければなりません。
このパラメーターがpageTokenです。
このpageTokenは最初の検索で1ページ目を表示するときには必要ありません。というか、性質上、pageTokenを表示するのは無理です。
なので、このpageTokenの値は最初のapiを投げたときに帰ってくるjsonの中に入っています。
$json_response[‘pagination’][‘nextToken’]
という階層になっています。
このnextTokenは次のページに行くためのトークンです。
(前のページに戻るトークンはpreviouToken)
このnextTokenの値を最初のページから次の2回目のapiアクセスをするときに一緒に渡してあげます(formなどで)。
そして、この2回目(2ページ目)以降のapiアクセスではこのnextTokenをpageTokenのvalueとしてパラメータ設定してあげます。
例えば、
$query = ‘includedData=attributes&keywords=naruto&marketplaceIds=*****&pageSize=10&pageToken=********’
(ちなみに、1回目は$query = ‘includedData=attributes&keywords=naruto&marketplaceIds=*****&pageSize=10というようにpageTokenのパラメータを入れずにアクセスします。2ページ目以降を見たいときにこのクエリにpageTokenを追加する形になります)
といった形です。これは見やすく書いているので実際は各クエリのvalueは変数になっています。
特にpageTokenは長い文字列ですので変数に入れて前のページから渡されます。
これで10個ずつ表示することができるようになりました。
しかし、問題が起きたのです。
次のページが表示されないという問題
昨年mwsからsp-apiに切り替えてから特に問題が発生していなかったのですが、最近になって次のページが取得できないという問題が生じていました。
どこか変更点でもあったのかなと思ったのですがそのようなアナウンスは見られませんでした。
数年前にmwsを扱っていたのときにも文字コードかなんかが原因でapiの結果が返ってこないことがあったので今回もそれかなと思いました。
そこで、色々調べてみたのですが、このpageTokenのvalueであるnextTokenやpreviouTokenの文字列にイコール(=)が入っていたのです。しかも私の場合はイコールが二つ入っていました。
このnextTokenはpageTokenのパラメータで、クエリに入れる文字列ですので、イコールは使えません。
イコールはパラメータのkeyとvalueを繋ぐときに使いますから。
なので、このイコールをurlのクエリでも使えるようにurlencodeしてあげる必要があります。
phpではurlencodeという関数があるのでそれですぐに解決します。
$nextToken = urlencode($nextToken)
このような感じです。
これで以前ように2ページ目以降も問題なく表示できるようになりました。
独学プログラマのために
今回の問題はエンジニアならすぐに解決できる内容なのかもしれません。私は独学プログラマなので他の人のことなどは分かりません。
ただ言えるのは、もし私が今駆け出しの独学プログラマならこれを解決するのに時間がかかっただろうということです。
数年目にmwsで同じような問題が起きた時は有料でサービスを展開し始めた時だったのでとても焦ったことを覚えています。
今は何となく原因があのあたりかななんてのが分かるようになってきているのでそれほど焦りません。
当時も今もですが、あまりapiに付いて詳しく教えてくれるようなブログとかなかったんですよね。
もしかしたら今、前の自分のように同じ問題で悩まれている方がいるかもしれませんので、その方の一助になれば幸いということでここに書き残しておこうと思います。
それでは。
コメント