表題の件です。
取得数に300件という上限のあるAPIデータを繰り返しリクエストすることで300件ずつ全件取得したいと考えております。
APIは、リクエストが返ってきた時にhasMoreがtrueならばさらにデータが存在することを意味します。その時、nextPageTokenも発行され、urlにtokenをつけて再リクエストすることで次のデータが取得できる仕様になっています。
Laravelのartisanコマンドを使い、以下のGetDataクラスを実行し試みました。全ての取得が終わり、hasMoreがtrueでなくなったときにreturnして値を返すようにしています。しかし、返ってきた値はどうしても空になってしまいます。return直前のprint_r($allrecords)をチェックすると問題なく全件取得できているのですが、returnして返ってきた値は空です。
どういう現象なのか理解できす、解決方法も分かりません。拙い説明で申し訳ありません。
別のクラスへ値を渡し、データを加工→別システムにあるデータを更新、ということをしたいと考えております。どうかご教授お願い致します。同期、非同期が関係するのかと考えましたが、全然詳しくなく手を出せずにいます。
public function GetData () { $Data = $this->searchData('',''); print_r($Data); //これは空になってしまいます } public function searchData ($opt_records, $nextPageToken) { if (isset($opt_records)) { $allrecords = $opt_records; }else{ $allrecords = []; } $limit = 300; $url = "https://api.abc.com/v2.0/xxxx/search?range=all&limit=".$limit; $method = "GET"; $token = 'xxxxxxxxxxxxxxxxxxx'; if ($nextPageToken) { $url = $url.$nextPageToken; } //接続 $client = new Client(); $response = $client->request($method, $url,[ 'headers' => [ 'X-xxxxxx-Api-Key' => $token ], ]); //エラーの場合 if ($response->getStatusCode() !== 200) { $this->log("searchData error:" . print_r($response, true)); return $allrecords; } if($response->getStatusCode() == 200){ $posts = $response->getBody(); $posts = json_decode($posts, true); if (!$allrecords) { $allrecords = $posts['data']; }else{ $allrecords = array_merge($allrecords,$posts['data']); } if ($posts['hasMore'] == 1 || $posts['nextPageToken']) { $nextPageToken = '&nextPageToken='.$posts['nextPageToken']; $this->searchSansanData($allrecords,$nextPageToken); }else{ print_r($allrecords); //ここで取得できていることは確認できました return $allrecords; //returnすると空になってしまいます } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/20 05:57
2021/07/21 12:14