開発情報・ナレッジ

投稿者:SPIRERS ナレッジ向上チーム 2022年3月1日 (火)

レコード一括登録依頼/取得(batch) のサンプルプログラム

SPIRAL ver.2で追加された新しいメソッドである「Batch」のサンプルプログラムを作成しました。
「Batch」を使うことでCSV,TSV形式のデータを、API経由でSPIRALのデータベースに登録することが
できるようになります。
マルチパート形式でのリクエストなど分かりにくい部分もありますので、参考になれば幸いです。

※サポートサイトに同様の記事が掲載された場合、この記事は削除される可能性があります。
※記事内のサンプルプログラムの不具合やもっとこうした方が良いなどの改善点がございましたら、
   リクエストボードにお寄せください。

仕様・特徴

・TSV,CSVファイル(TSV,CSV形式の文字列)のリクエストができる
・1度のリクエストでバルク(bulk)よりも大量データの処理ができる
・CSVアップロードや基幹システム連携などで活用できる

ファイルの制限

・ファイル拡張子はtsvかcsv
・文字コードはUTF-8
・ファイルサイズは100MB以下
・ファイルにヘッダ行を付ける必要がある
・フィールドタイプ「ファイル」「パスワード」は対象外の為、ヘッダ行に含めてはいけない
・ファイル名に \ / : * ? " < > | を含めてはいけない

サンプルプログラム説明

プログラム処理
1)APIでレコード一括登録依頼作成を実行
サンプルプログラムではcsv形式の文字列の登録依頼を行っています。
SPIRAL外ページであれば file_get_contents(""); などで読み取ったファイルも指定できます。
SPIRAL上だとファイル関数は使えないため、Javascriptでのファイル読み取りが必要になります。
2)レスポンス($batchInsertRespone)が返却
一括登録依頼IDやステータスなどが返却されます。
この時点では一括登録依頼の成功/失敗しか判別できないため、
データ登録が成功したか失敗したかは3を実行して確認します。
3)APIでレコード一括登録依頼取得を実行
2で返却された一括登録依頼IDを使って、レコード一括登録依頼取得を実行します。
4)レスポンス($getBatchInsertResponse)が返却
1で依頼したデータ登録が成功したか失敗かのステータスが確認できます。
基本的に依頼作成と依頼取得はワンセットで行う必要があります。

1の依頼後データ登録には数秒かかるため、3を実行する前にしばらく待機する必要があります。
実際に案件などで使用する場合は、エラー処理などを追加する必要がありますので、
処理時間などを考慮して記述するようにしてください。
・batchサンプルプログラム
<?php
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", ""); // アカウントで設定したAPIキー
define("BOUNDARY", "WebKitFormBoundary7MA4YWxkTrZu0gW");

// 一括登録先のアプリIDとDBIDを指定
$apiPath = "/apps/{app}/dbs/{db}/records/";

//------------------------------------------------------------
// batch レコード一括登録依頼を作成
// https://docs.spiral-platform.com/api/#operation/createBatchInsert
//------------------------------------------------------------
// APIURLパス
$addUrlPass = $apiPath. "batchInserts";

// ファイル名
$fileName = "test.csv";
// ファイルデータ
$fileData = "text,textarea,number,phone\r\n";
$fileData .= "test,testtest,1234,0312341234";
// リクエストボディ(マルチパート形式)
$body = "--". BOUNDARY. "\r\n";
$body .= "Content-Disposition: form-data; name=\"file\"; filename=\"". $fileName. "\"\r\n";
$body .= "Content-Type: text/plain\r\n\r\n";
$body .= $fileData. "\r\n";
$body .= "--". BOUNDARY. "\r\n";
$body .= "Content-Disposition: form-data; name=\"onError\"\r\n\r\n";
$body .= "rollback\r\n"; // rollback or ignore
$body .= "--". BOUNDARY. "--";

$header = array(
    "Authorization:Bearer ". API_KEY,
    "Content-Type: multipart/form-data; boundary= ". BOUNDARY,
    "X-Spiral-App-Authority: ". "manage", // 実行権限(管理者)
    "X-Spiral-App-Role: ". "_fullAccess", // アプリロール(全権限)
    "X-Spiral-Api-Version: 1.1", // APIバージョン(1.1)
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);

$batchInsertRespone = json_decode($response , true);
print_r($batchInsertRespone);

//------------------------------------------------------------
// batch レコード一括登録依頼を取得
// https://docs.spiral-platform.com/api/#operation/getBatchInsert
//------------------------------------------------------------
// 一括登録依頼ID
$batchInsertId = $batchInsertRespone["id"];
// APIURLパス
$addUrlPass = $apiPath. "batchInserts/". $batchInsertId;

$header = array(
    "Authorization:Bearer ". API_KEY,
    "Content-Type: application/json",
    "X-Spiral-App-Authority: ". "manage", // 実行権限(管理者)
    "X-Spiral-App-Role: ". "_fullAccess", // アプリロール(全権限)
    "X-Spiral-Api-Version: 1.1", // APIバージョン(1.1)
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);

$getBatchInsertResponse = json_decode($response , true);
print_r($getBatchInsertResponse);
?>
マルチパート形式
一括登録依頼のリクエストボディですが、マルチパート形式である必要があります。
--WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="(fileName)"
Content-Type: text/plain

(fileData)
--WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="onError"

rollback
--WebKitFormBoundary7MA4YWxkTrZu0gW--
上記のように記載方法はかなり固定されたものです。改行がないなどでエラーになりますので注意してください。
(fileName)や(fileData)部分は、登録するファイルに合わせて適宜変更してください。

rollback は登録にエラーした時に、全件ロールバックするという設定です。
ここを ignore に変えると、エラー行のみをスキップして正常な行は登録する設定に変更できます。
解決しない場合はこちら コンテンツに関しての
要望はこちら