APIによってレコード一覧を取得する場合、
1回のリクエストでは取得できるレコード数に制限があります。
limitの値が一回のリクエストで取得するレコード数ですが、こちらの上限値が200件までとなっております。
APIリファレンス
この時に200件以上のレコードを取得したい時の方法をご紹介いたします。
具体的には最大値200件とするリクエストを複数回行ってレコードを取得します。
例えば2000件取得したい場合は200件取得するリクエストを10回行う事となります。
PHPソース
<?php $cmnBase = CommonBase::getInstance(); // 変数の定義 (SPIRAL ver.2 API) define('apiUrl', "https://api.spiral-platform.com/v1/"); //変更無しでOKです。 define('apiKey', "xxxxxxxxx"); //APIキーを設置してください。 define('apiRole', ""); //apiロールを用いる場合は適宜設定してください。設定しない場合は空白でOKです。 define('appId', '99999'); //取得したいDBのAPPIDを記載してください。 define('dbId', '88888'); //取得したいDBのDBIDを記載してください。 $items = []; // 結果を格納する配列 $offset = 0; // 初期オフセット $limit = 200; // 1回のリクエストで取得するレコードの数 do { // APIリクエスト $response = $cmnBase->apiGetCurlAct('apps/' . appId . '/dbs/' . dbId . '/records' . "?enableTotalCount=true&offset=$offset&limit=$limit"); //取得したいレコードに何れかの条件がある場合は上記カッコ内を編集してください。上記は無条件で全件取得のサンプルとなっております。 // レコードを$itemsに追加 $items = array_merge($items, $response['items']); // nextOffsetを更新 $offset = $response['nextOffset']; } while ($offset !== null); // nextOffsetがnullになるまで繰り返す $SPIRAL->setTHValue('records', $items); // 共通モジュール class CommonBase { protected static $singleton; public function __construct() { if (self::$singleton) { throw new Exception('must be singleton'); } self::$singleton = $this; } public static function getInstance() { if (!self::$singleton) { return new self(); } else { return self::$singleton; } } public function apiGetCurlAct($addUrlPass) { $head = array( 'Authorization:Bearer '.apiKey, 'X-Spiral-Api-Version: 1.1', ); if (apiRole) { $head = array_merge($head, array('X-Spiral-App-Role: '.apiRole)); } $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_URL, apiUrl.$addUrlPass); curl_setopt($curl, CURLOPT_HTTPHEADER, $head); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_TIMEOUT_MS, 10000); $resp = curl_exec($curl); if (json_decode($resp)) { return json_decode($resp, true); } else { return base64_encode($resp); } } } ?>
使い方
APIのレスポンスの仕様により200件あたりのオフセットが最後のオフセットとなると
nextOffsetの値がnullになります。
なのでnextOffsetの値がnullになるまでループし続けて配列に足していき全件取得をするサンプルとなります。
取得したレコード一覧は$itemsに入っていますので、適宜こちらの配列をご利用ください。
サンプルでは$SPIRAL->setTHValue('records', $items);
とthymeLeafに渡していますがこちらは適宜編集を行ってください。
注意点
SPIRALのAPIを利用する際には
1分間のリクエスト上限値
PHPの動作時間の上限値
以上の上限値がございます。
1分間のリクエスト上限値
本サンプルプログラムでは200件につき1リクエストいたします。2000件では10リクエストとなります。
例えば2000件取得する10リクエストの状態で
10ユーザが同時(1分間以内)にアクセスした場合、100リクエストされます。
標準提供は1分間600リクエストが上限値になっており、600リクエストを超えるとエラーが表示されてしまう為
ご注意ください。
※極端な例ですと200レコード*600リクエスト=12万レコード件以上の取得は1ユーザでも600リクエストを超えてしまう為
不可能となります。その場合は制限の引き上げや別方法をご検討ください。
API利用の詳細について
PHPの動作時間の上限値
本サンプルプログラムを用いてAPIにリクエストする時にはPHPを用います。SPIRALにはPHPの処理時間が30秒を超えてしまうとエラーとなる仕様がございます。
PHP実行環境の仕様について
このサンプルは最初の200件リクエスト→レスポンスを受け取る→次の200件をリクエストと
多重のリクエストを行っている為、SPIRALの状況によっては処理時間が長くなってしまう恐れがあります。
また、本サンプル以外のPHPの処理を行っている場合は全ての時間を足した時間が30秒制限の対象となります。
よって、PHPの処理になるべく時間がかからないようレコード取得に対して条件をつける等データの絞り込みを行い
リクエスト数をなるべく少なくする事を推奨いたします。