ローコードプラットフォームSPIRALのAPIを利用する（複数レコードの一括更新の使い方）

[SPIRAL](https://www.spiral-platform.co.jp/)は、主にエンタープライズ向けのローコードプラットフォームになります。ローコードプラットフォームなので、プログラミング知識がなくともWebアプリケーションを開発できるのが魅力です。

SPIRALでは、自社のシステムや外部システムと連携する場合を想定して、APIが公開されています。今回は、そのAPIを利用して、複数レコードを一括更新する流れを解説します。

## 注意点

SPIRALでは、SPIRAL内部で動作するアカウント内APIと、外部APIの2種類があります。アカウント内APIでは、簡単に操作できるPHP SDKがありますが、外部公開はされていません。そのため、今回はPHPの `file_get_contents` などを使ってAPI操作をしています。

## 準備
### APIトークンの取得

SPIRALの管理画面で、APIトークンを作成します。ダッシュボードの開発メニュー内のAPIトークンにて、新しいAPIトークンを作成します。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2f179584-06e1-49f4-9e2a-5b42a9334c71.png)


作成後に入手できるAPIトークンと、APIトークンシークレットをメモしておきます。

### データベースの作成

今回は、作成したのは通常DBになります。SPIRALでは、この他8種類のデータベースが利用できます。

[【機能紹介】各種DB \| SPIRAL ナレッジサイト](https://knowledge.spirers.jp/article/design/detail/730)

データベースの名前は `testdata` としました。作成したフィールドは以下の通りです。

| フィールド名   | サンプル値           | 型                                 | 差し替えキーワード |
| -------------- | -------------------- | ---------------------------------- | ------------------ |
| 名前           | テキスト30文字前後   | テキストフィールド(64 bytes)       | name               |
| フリガナ       | テキスト30文字前後   | テキストフィールド(32 bytes)かな   | furigana           |
| メールアドレス | aaa@bbb.cc.dd        | メールアドレス（大・小文字を無視） | mail               |
| 性別           | 男性、女性           | 性別                               | gender             |
| 年齢           | 0～99                | 数値                               | ageyo              |
| 誕生日         | yyyy年mm月dd日       | 日付（○年○月○日）                  | birthday           |
| 婚姻状況       | 独身                 | テキストフィールド(32 bytes)       | maritalStat        |
| 都道府県       | プルダウンから選択   | 都道府県                           | prefecture         |
| 電話番号       | 09012345678          | 電話番号                           | telephone          |
| キャリア       | docomo、au、SoftBank | テキストフィールド(32 bytes)       | carrier            |
| スタイル       | スタイル             | テキストフィールド(32 bytes)       | style              |

## コードについて

今回はPHPで作成しています。

### APIトークンの保存

APIトークンとシークレットは、環境変数に保存します。以下のように `.env` ファイルを作成し、トークンを保存します。

```env
API_TOKEN=your_api_token
API_TOKEN_SECRET=your_api_token_secret
```

.env の読み込みは `vlucas/phpdotenv` を使っています。インストールは `composer` で行います。

```bash
composer require vlucas/phpdotenv
```

次に、PHPのコード内で `.env` を読み込みます。

```php
require_once __DIR__ . "/vendor/autoload.php";

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
```

### APIリクエストURLの取得

APIでリクエストするURLは、以下の手順で取得します。

```php
// ロケータのURL (変更の必要はありません)
$locator = "https://www.pi-pe.co.jp/api/locator";

// スパイラルの操作画面で発行したトークンを設定します。
$TOKEN = $_ENV['API_TOKEN'];
$SECRET = $_ENV['API_TOKEN_SECRET'];

// API用のHTTPヘッダ
$api_headers = array(
    "X-SPIRAL-API: locator/apiserver/request",
    "Content-Type: application/json; charset=UTF-8",
);

// 送信するJSONデータを作成
$parameters = array();
$parameters["spiral_api_token"] = $TOKEN; //トークン

// 送信用のJSONデータを作成します。
$json = json_encode($parameters);

// curlライブラリを使って送信します。
$curl = curl_init($locator);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
curl_setopt($curl, CURLOPT_HTTPHEADER, $api_headers);
curl_exec($curl);

// エラーがあればエラー内容を表示
if (curl_errno($curl)) echo curl_error($curl);
$response = curl_multi_getcontent($curl);
curl_close($curl);
$response_json = json_decode($response, true);

// サービス用のURL
$APIURL = $response_json['location'];
```

この時のレスポンスは以下のようになっています。詳細は[SPIRAL ver\.1 API リファレンス](https://support.smp.ne.jp/api/index.html#operation/locatorApiserver)にて確認してください。

```json
{
  "code": 0,
  "message": "OK",
  "location": "https://（APIサーバ）/api/service",
  "default_version": 2,
  "supported_version": [1, 2],
  "use_client_crt": "f"
}
```

`location` にAPIサーバのURLが入っています。

### データの作成

一括登録するデータを作成します。一括登録は1,000件までなので、データが1,000件を超える場合は、分割して登録します。

```php
// 送信パラメータを設定します
$parameters = array();
$parameters["db_title"] = "testdata";
$parameters["columns"] = array(
    "name", "furigana", "email", "gender", "ageyo", "birthday", "maritalstat",
    "prefecture", "telephone", "carrier", "style"
);

// ファイルからデータを読み取り、bulk_insert APIメソッドを呼び出します
$line = file("records10000.txt");
$n = 0;
$parameters["data"] = array();
for ($i = 0; $i < count($line); $i++) {
  $data = explode("\t", $line[$i]);
  if (count($data) == count($parameters["columns"])) {
    array_push($parameters["data"], $data);
    if (count($parameters["data"]) >= 1000) {
      bulk_insert($parameters);
      $parameters["data"] = array();
    }
  }
}
```

`records10000.txt` の内容は以下のようになっています。データはLLMで作成したダミーです。

```txt
山崎 加奈	オオタ アキラ	kumiko98@inoue.com	2	18	2007/03/20	0	10	070-4690-4807	rakuten	カジュアル
高橋 健一	キムラ ミキ	gota@murakami.jp	1	34	1990/11/17	1	39	03-4302-6520	その他	カジュアル
加藤 花子	ゴトウ ケンイチ	tsubasatakahashi@yahoo.com	2	53	1972/03/18	1	11	070-2494-5447	docomo	カジュアル
田中 浩	ヤマモト ミキ	sayuri67@hotmail.com	3	64	1961/02/27	0	20	76-4896-4543	docomo	ビジネス
高橋 さゆり	ヤマモト キョウスケ	nishimurayasuhiro@yahoo.com	1	29	1995/06/09	0	16	090-4311-1213	その他	スポーティ
池田 晃	キムラ ヤスヒロ	yasuhiro76@yahoo.com	2	38	1986/09/13	1	27	38-3498-5198	その他	ビジネス
```

### データの一括登録

データが用意できたら、一括登録を行います。リクエストは `database/bulk_insert/request` というヘッダーで行います。

```php
$TOKEN = $_ENV['API_TOKEN'];
$SECRET = $_ENV['API_TOKEN_SECRET'];
$APIURL = get_application_url($TOKEN, $SECRET);
$api_headers = array(
    "X-SPIRAL-API: database/bulk_insert/request",
    "Content-Type: application/json; charset=UTF-8",
);
$param_parameters["spiral_api_token"] = $TOKEN;
$param_parameters["passkey"] = time();
$key = $param_parameters["spiral_api_token"] . "&" . $param_parameters["passkey"];
$param_parameters["signature"] = hash_hmac('sha1', $key, $SECRET, false);
$json = json_encode($param_parameters);
$curl = curl_init($APIURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
curl_setopt($curl, CURLOPT_HTTPHEADER, $api_headers);
curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
$returnval = curl_multi_getcontent($curl);
curl_close($curl);
return $returnval;
```

レスポンスは以下のようになります。

```json
{
  "code": "0",
  "ids": [111,112,113...208,209,210],
  "message": "OK"
}
```

管理画面で見ても、データが一括登録できています。

![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/eeed7b69-550e-4bfe-943f-92105b573115.jpeg)


## まとめ

今回はSPIRALのAPIを利用して、複数レコードの一家登録を行う流れを紹介しました。大量のデータを登録する際に1件ずつ行っていると時間がかかり、APIのリクエスト数制限にも引っかかる可能性があります。ぜひ、こちらのAPIを利用してください。

1分あたりのAPIのリクエスト数は、契約によって上限があります。ご注意ください（詳細は[APIのリクエスト数制限を知りたい SPIRAL ver\.1 サポートサイト](https://support.smp.ne.jp/faq/api-faq/f0094/)にて）。

[API SPIRAL ver\.1 サポートサイト](https://support.smp.ne.jp/api-manuals/)