目次
SPIRALⓇとは?
SPIRALⓇ(以下SPIRAL)とはスパイラル株式会社(旧株式会社パイプドビッツ)が提供するサービスでSPIRAL ver.1は、柔軟なデータベースを中心として、Webアプリ構築に必要なさまざまな機能が備わったプラットフォームです。システム環境構築は不要で、データ入出力、認証、メール配信、API連携などの部品を組み合わせたWebアプリ開発(ローコード開発)が行えます。
といったサービスのようです。
要はデータを一元管理するのでそれを元に会員専用サイトや問い合わせフォームやメール配信を行いますよという感じですね
弊社が手掛けるようなWebサイト上のシステム構築をサーバーを用意することなく行え、しかもデータ管理も行ってくれるので、サーバー担当者を専任できないが情報セキュリティにはしっかり対応したいという場合には選択肢に入るのではないでしょうか
しかも導入実績がすごい
大手企業ばかりですね。
特に会員登録を行いメールマガジンなど一括配信する場合には最適かもしれません
スパイラル APIってどういうの?
ただここでSPIRALの説明をしても仕方が無いので、SPIRALの機能であるデータベースをAPIから操作するようにしたいと思います。これのメリットとしては以下の点となります
- データベースをwebサーバーではなく外部サーバー(SPIRAL)にすることでデータの安全性をSPIRAL基準で確保できる
- 登録したデータのメールアドレス宛にメール配信やメールマガジンなど一括送信を行う事ができる
- REST形式で行うため一般的なREST APIと同じ要領で行う事が可能
2.はどちらかというと副次的な話になりますが、SPIRALにはメール配信機能があるため、SPIRAL上でメール配信を行えるのが大きいですね。
(一括メール配信を自前で作ろうとすると割と大変で、短時間に大量のメールを送信するとなると、メールサーバーへの負荷やエラーメールの処理を行う必要があり、サーバー側で連携を取るなどの処理を行わないと、キャリアブロックが発生してメール遅延発生の原因となるので…)
3.はありがたいですね。これであればJavaScriptからでもPHPや他の言語からも可能です。
ただもちろんデメリットもあり…
- データ件数に比例して料金が変わる段階制料金プランである
- APIのアクセス数に制限がある
- 1度のAPIのアクセスで取得できる最大件数が1,000件である
1.に関してはテーブルを何個か作っても合計件数で判断されるため、あらかじめサービスの想定件数を考えておく必要があります。
2.は1分あたり何回までという制限がありますが、オプションでその回数を増やすことが可能ですので、こちらもあらかじめ想定回数を決めておきましょう。
3.に関しては固定となり増やすことができないのでプログラム上でフォローする必要があります。
その他にもデータベース同士にリレーションを貼る制限がある(同じ組み合わせは1種類のみ)などがありますので、そこを考慮したテーブル設計が必要となります。
PHPで実装する方法
基本的にサポートサイトにサンプルがあるので、それを見て貰うのが確実ですが、こんな感じで実装しましたという忘備録的な感じでまとめておきますAPIのリクエスト先を取得
スパイラルAPIのリクエスト先を取得するlocator APIに接続します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function getServiceUrl(){ // API用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: locator/apiserver/request", "Content-Type: application/json; charset=UTF-8", ); $api_token = "xxxxxxxxxxxxxxxxxxxxxxxx"; // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = $api_token; //トークン // 送信用のJSONデータを作成します。 $json = json_encode($parameters); // curlライブラリを使って送信します。 $curl = curl_init($this->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 $api_url = $response_json['location']; return $api_url; } |
$api_token は SPIRALの設定画面から取得してください。
ここではハードコピーしてますが、設定ファイルに定数で定義するのがいいのかなと思います。
1 2 |
// リクエスト先を取得する $api_url = getServiceUrl(); |
こんな感じで取得できます。
SELECTについて
ここら辺はめんどくさかったので関数化して都度呼び出ししてます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
function select($table_name, $select_columns = array(), $search_condition = array() , $sort_name = 'created_at' , $sort_by = 'DESC' , $lines_per_page = 20, $page = 1, $sorts = array() ) { // API用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: database/select/request", "Content-Type: application/json; charset=UTF-8", ); // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = $api_token; // ← SPIRALから発行されたapi token $parameters["passkey"] = time(); // 署名を付けます $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $secret = $this->api_token_secret; $parameters["signature"] = hash_hmac('sha1', $key, $secret, false); // スキーマ情報を取得するDBタイトル $parameters["db_title"] = $table_name; $parameters["lines_per_page"] = $lines_per_page; $parameters["page"] = $page; // 表示カラム名 if(count($select_columns) > 0){ $parameters["select_columns"] = $select_columns; } // 検索条件 if(count($search_condition) > 0){ $parameters["search_condition"] = $search_condition; } $_sorts = $sorts ?? array(); // 表示順 if(count($_sorts) > 0){ foreach($_sorts as $key => $values){ $parameters["sort"][$key] = $values; } }else{ $parameters["sort"][0]["name"] = $sort_name; $parameters["sort"][0]["order"] = $sort_by; $parameters["sort"][1]["name"] = "id"; $parameters["sort"][1]["order"] = $sort_by; } $json = json_encode($parameters); // curlライブラリを使って送信します。 $curl = curl_init($api_url); // getServiceUrl()関数で取得したURL 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); if($response == ""){ // レスポンスが空なのでエラー }else{ curl_close($curl); $json = json_decode($response, true); if($json["code"] == 0){ $res = array(); foreach ($json["data"] as $key => $value) { $res[$key] = array(); foreach ($value as $k => $value2) { $res[$key][$select_columns[$k]] = $value2; } } return $res; }else{ // codeが0以外なのでエラー } } } |
こんな感じで関数にしてます。使い方としては
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// SPIRALのテーブル名 $spiral_table = "users"; // 表示項目 $select_columns = array( "id", "name", "email", "created_at", ); // 絞り込み条件 $search_condition = array(); // ユーザーIDが 1の場合 $search_condition[] = array("name" => "user_id", "value" => 1, "operator" => "="); $users = select($spiral_table, $select_columns, $search_condition, 'created_at', 'desc', 10, 1); |
こんな感じで それぞれを指定します。
なお、絞り込み条件ですが、複数絞り込みたい場合は以下のようになります。
1 2 3 4 |
// WHERE (id = 1 or id = 2 ) AND name = '麦茶' $search_condition[] = array("name" => "id", "value" => 1, "operator" => "=", "logical_connection" => "or"); $search_condition[] = array("name" => "id", "value" => 2, "operator" => "=", "logical_connection" => "or" ); $search_condition[] = array("name" => "name", "value" => "麦茶", "operator" => "="); |
そうすると$usersの中に表示したい項目が連想配列で入ってくるのであとはPHPで加工してください。
INSERT について
INSERTも関数にしてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// 新規登録 function insert($table_name, $ins_data ){ // API用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: database/insert/request", "Content-Type: application/json; charset=UTF-8", ); // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = $this->api_token; $parameters["passkey"] = time(); // 署名を付けます $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $secret = $this->api_token_secret; $parameters["signature"] = hash_hmac('sha1', $key, $secret, false); // スキーマ情報を取得するDBタイトル $parameters["db_title"] = $table_name; $parameters["data"] = $ins_data; $json = json_encode($parameters); // curlライブラリを使って送信します。 $curl = curl_init($this->api_url); 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); $json = json_decode($response, true); if($json["code"] == 0){ // 新しいID return $json["id"]; }else{ $this->error($json, $parameters); } } |
戻り値は投稿されたIDとなるようにしてます。
使い方は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 登録するデータ $ins_data = array(); $data = array(); $data["name"] = "name"; $data["value"] = "烏龍茶"; $ins_data[] = $data; $data = array(); $data["name"] = "email"; $data["value"] = "hogehoge@example.com"; $ins_data[] = $data; $spiral_table = "users"; $res = $spiral->insert($spiral_table, $ins_data); |
こんな感じです。登録するデータを$ins_dataに連想配列で入れます。
UPDATEについて
基本的にSELECTとINSERTを足したような感じですね
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
// 更新 function update($table_name, $ins_data, $search_condition = array() ){ // WHEREがない更新や削除はあり得ないので if(count($search_condition) == 0){ $json = array(); $parameters = array(); $this->error($json, $parameters); } // API用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: database/update/request", "Content-Type: application/json; charset=UTF-8", ); // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = $this->api_token; $parameters["passkey"] = time(); // 署名を付けます $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $secret = $this->api_token_secret; $parameters["signature"] = hash_hmac('sha1', $key, $secret, false); // スキーマ情報を取得するDBタイトル $parameters["db_title"] = $table_name; $parameters["data"] = $ins_data; // 検索条件 if(count($search_condition) > 0){ $parameters["search_condition"] = $search_condition; } // $json = json_encode($parameters, JSON_HEX_TAG); $json = json_encode($parameters); // curlライブラリを使って送信します。 $curl = curl_init($this->api_url); 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); $json = json_decode($response, true); if($json["code"] == 0){ // 更新数 return $json["count"]; }else{ // エラー } } |
処理の中で特筆すべきなのが
1 2 3 4 5 6 |
// WHEREがない更新や削除はあり得ないので if(count($search_condition) == 0){ $json = array(); $parameters = array(); $this->error($json, $parameters); } |
これですね。
絞り込み条件をつけないと一括更新されてしまい登録データが全部書き換わるので、念のために仕込んでます。
使い方は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 登録するデータ $upd_data = array(); $data = array(); $data["name"] = "name"; $data["value"] = "飲茶"; $upd_data[] = $data; // 絞り込み条件 $search_condition = array(); // ユーザーIDが 1の場合 $search_condition[] = array("name" => "user_id", "value" => 1, "operator" => "="); $spiral_table = "users"; $res = $spiral->update($spiral_table, $upd_data, $search_condition); |
簡単ですね、本当にINSERTとSELECTを足したような処理ですね
DELETEについて
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
// 削除処理 function delete($table_name, $search_condition = array() ){ // WHEREがない更新や削除はあり得ないので if(count($search_condition) == 0){ $json = array(); $parameters = array(); $this->error($json, $parameters); } // API用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: database/delete/request", "Content-Type: application/json; charset=UTF-8", ); // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = $this->api_token; $parameters["passkey"] = time(); // 署名を付けます $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $secret = $this->api_token_secret; $parameters["signature"] = hash_hmac('sha1', $key, $secret, false); // スキーマ情報を取得するDBタイトル $parameters["db_title"] = $table_name; // 検索条件 if(count($search_condition) > 0){ $parameters["search_condition"] = $search_condition; } $json = json_encode($parameters); // curlライブラリを使って送信します。 $curl = curl_init($this->api_url); 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); $json = json_decode($response, true); if($json["code"] == 0){ // 削除数 return $json["count"]; }else{ $this->error($json); } } |
ここにも絞り込み条件が無い場合エラーにするようにしています。
使い方は
1 2 3 4 5 6 7 |
// 絞り込み条件 $search_condition = array(); // ユーザーIDが 1の場合 $search_condition[] = array("name" => "user_id", "value" => 1, "operator" => "="); $spiral_table = "users"; $res = $spiral->delete($spiral_table, $search_condition); |
簡単に消えちゃいますね。
一度消すと二度と復旧できないのは変わらないので、実行するときはかなりの緊張感が出てきますね。
WordPress内で使用できる?
できます!WordPressはPHPなので、上記の記述も問題なく動きます。
ただ、WordPressのデータベースをSPIRAL DBにすることはできません。
あくまでWordPressの枠組みの中に入れることが可能という位置づけです。
WordPressの管理画面で使いたいなら独自プラグインを作成し、その中でSPIRAL APIを使いましょう。
困ったことは?
基本的な機能については困らないですが、やはりAPIの使用回数制限が厳しくなるときがあります。特にバッチ処理などで一括で何百件も変更したい場合は、APIの使用制限に引っかかるリスクがあるため、処理をするときにあらかじめその部分を加味した処理を行う必要があります。
(処理件数をカウントして危なそうになったら処理を止めて次の機会に回すなど)
あとはテスト環境というかテスト用テーブルを自分で作る必要があり、そこで使用するデータ件数もカウントされてしまうという事ですね
ですので、一度本番データをテストテーブルに移してというのはやりづらいかなと思ったりします。
とはいえ、登録したデータをSPIRALで活用できるのは大きく、安心のパイプド…スパイラル社による管理となるため、使い方を間違えなければ便利だと思います。
外部参考サイト
スパイラルAPIの使い方https://support.smp.ne.jp/api-manuals/spiral_api/