開発情報・ナレッジ

投稿者: ShiningStar株式会社 2024年1月26日 (金)

APIで200件以上のレコードを取得するサンプルプログラム

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の処理になるべく時間がかからないようレコード取得に対して条件をつける等データの絞り込みを行い
リクエスト数をなるべく少なくする事を推奨いたします。

解決しない場合はこちら コンテンツに関しての
要望はこちら