ローコードプラットフォームSPIRALのAPIを利用する（データベースのCRUD操作）

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

SPIRALでは、自社のシステムや外部システムと連携する場合を想定して、APIが公開されています。今回は、そのAPIを利用して、データベースのCRUD操作を行う流れを紹介します。

## 注意点

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

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

## 準備

### APIトークンの取得

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

![FireShot Capture 669 - API設定 - pi-pe.smp.ne.jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7d5612d4-5a83-4931-bcf3-0fe7505ee82e.jpeg)


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

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

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

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

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

| フィールド名 | 差し替えキーワード | 型                          |
| ------------ | ------------------ | --------------------------- |
| 項目名       | name               | テキストフィールド(32 vtes) |
| 数値         | number             | 正数                        |
| 登録日時     | registerAt         | 登録日時                    |

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7f93adbf-f755-49af-863f-7c668f70b98a.png)



## コードについて

今回は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が入っています。

### データベースへの新規登録

まず、データベースへの新規登録を行う流れです。最初にパラメータを作成します。データベース名、フィールド名は作成したものに合わせて修正してください。

```php
// リクエストデータを作成
$parameters = array();
$parameters["spiral_api_token"] = $TOKEN; //トークン
$parameters["db_title"] = "DemoDB"; //DBのタイトル
$parameters["passkey"] = time(); //エポック秒

// 登録したいデータを設定します（１件分）
$parameters["data"] = array(
    array("name" => "name", "value" => "名前の値"),
    array("name" => "number", "value" => "1000"),
    array("name" => "registerAt", "value" => "now"),
);

// 署名を付けます
$key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"];
$parameters["signature"] = hash_hmac('sha1', $key, $SECRET, false);

// JSON形式にエンコードします
$json = json_encode($parameters);
```

そして、リクエストを行います。

```php
// curlライブラリを使って送信します。
$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);
$response = curl_multi_getcontent($curl);
curl_close($curl);

// 画面に表示
print_r(json_decode($response, true));
```

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

```json
{
  "code": 0,
  "message": "OK",
  "id": 1
}
```

`id` に登録したデータのIDが入っています。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/b04e4f72-2e73-492f-bad5-1d09c25f46df.png)


### データベースのデータ取得

次に、登録したデータを取得する流れです。まずはパラメータを作成します。 `search_condition` にて検索条件を指定し、 `select_columns` には取得したいフィールド名を指定します。

```php
// 送信するJSONデータを作成
$parameters = array();
$parameters["spiral_api_token"] = $TOKEN; //トークン
$parameters["db_title"] = "DemoDB"; //DBのタイトル
$parameters["passkey"] = time(); //エポック秒

// 検索条件
$parameters["search_condition"] = array(
  array("name" => "id", "value" => "2", "operator" => "="),
);
$parameters["select_columns"] = array(
  "id",
  "name",
  "number",
  "registerAt",
);

// 署名を付けます
$key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"];
$parameters["signature"] = hash_hmac('sha1', $key, $SECRET, false);

// 送信用のJSONデータを作成します。
$json = json_encode($parameters);
echo "===> database/select\n";

// curlライブラリを使って送信します。
$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);
$response = curl_multi_getcontent($curl);
curl_close($curl);

// 画面に表示
print_r(json_decode($response, true));
```

レスポンスとして得られるJSONは以下のようになっています。

```json
{
  "code": "0",
  "data": [
    [
      "2",
      "名前の値",
      "1000",
      "2025年4月10日 11時30分50秒"
    ]
  ],
  "count": "1",
  "header": [
    "id",
    "項目名",
    "数値",
    "登録日時"
  ],
  "label": [
    {},
    {},
    {}
  ],
  "message": "OK"
}
```

## データベースの更新

データベースの更新は、前述の選択条件に対して、データの更新情報を適用します。 `data` キーで、実際に更新する値とフィールドを指定します。

```php
// 送信するJSONデータを作成
$parameters = array();
$parameters["spiral_api_token"] = $TOKEN; //トークン
$parameters["db_title"] = "DemoDB"; //DBのタイトル
$parameters["passkey"] = time(); //エポック秒

// 検索条件
$parameters["search_condition"] = array(
  array("name" => "id", "value" => "1", "operator" => "="),
);

// 更新データ
$parameters["data"] = array(
  array("name" => "name", "value" => "更新した値"),
  array("name" => "number", "value" => "2000"),
);

// 署名を付けます
$key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"];
$parameters["signature"] = hash_hmac('sha1', $key, $SECRET, false);

// 送信用のJSONデータを作成します。
$json = json_encode($parameters);
echo "===> database/update\n";

// curlライブラリを使って送信します。
$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);
$response = curl_multi_getcontent($curl);
curl_close($curl);

// 画面に表示
print_r(json_decode($response, true));
```

レスポンスは以下のようなJSONです。

```json
{
  "code": 0,
  "message": "OK",
  "count": 1
}
```

![FireShot Capture 694 - DBオペレーション } DBデモ - pi-pe.smp.ne.jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/15f9a2b5-e6ab-4f87-a534-ef4948acfc93.jpeg)


## データベースの削除

データベースの削除は、選択条件を指定して、その条件にマッチするデータを削除します。

```php
// 送信するJSONデータを作成
$parameters = array();
$parameters["spiral_api_token"] = $TOKEN; //トークン
$parameters["db_title"] = "DemoDB"; //DBのタイトル
$parameters["passkey"] = time(); //エポック秒

// 検索条件
$parameters["search_condition"] = array(
    array("name" => "id", "value" => "1", "operator" => "="),
);

// 署名を付けます
$key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"];
$parameters["signature"] = hash_hmac('sha1', $key, $SECRET, false);

// 送信用のJSONデータを作成します。
$json = json_encode($parameters);
echo "===> database/delete\n";

// curlライブラリを使って送信します。
$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);
$response = curl_multi_getcontent($curl);
curl_close($curl);
// 画面に表示
print_r(json_decode($response, true));
```

レスポンスは更新時と同じです。

```json
{
  "code": 0,
  "message": "OK",
  "count": 1
}
```

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e1b8c769-6e10-46a7-8ea7-2b1cfe312457.png)


## まとめ

今回はSPIRALのAPIを利用して、データベースのCRUD操作を行う流れを紹介しました。SPIRALを使って、社内システムや外部システムと連携する際の参考にしてください。

なお、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/)