開発情報・ナレッジ

投稿者:SPIRERS ナレッジ向上チーム 2022年10月28日 (金)

APIメソッドごとのサンプルコードまとめ Record File

この記事では Record File のメソッドごとに、サンプルコードをまとめています。
SPIRAL ver.2 でAPIを使用する時の参考になれば幸いです。

はじめに

この記事で紹介するサンプルコードでは、共通のcurl送信用モジュールを使用しています。
そのため、必ず下記のモジュールを記載するようにしてください。

※共通モジュールなので、APIメソッドを複数回実行する場合でも1回だけ記載すれば大丈夫です。
※APIメソッドを複数回実行する場合は、サンプルコードの「API実行」部分に適宜記述を追加してください。
共通モジュール
//------------------------------
// 共通用モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "X-Spiral-Api-Version: 1.1",
        );
        if($multiPart) {
            $header = array_merge($header, array($multiPart));
        } else {
            $header = array_merge($header, array("Content-Type:application/json"));
        }
        if(APP_ROLE){
			$header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            if ($multiPart) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        if($jsonDecode){
			return $response;
		}else{
            return json_decode($response, true);
		}
    }
}

設定値に関して

共通で使用する値に関しては、定数として初めに設定します。
具体的には下記のような値を設定してください。
API_URL リクエスト先URLの固定部分です。固定値ですので特に変更する必要はありません。
API_KEY 発行したAPIキーを設定してださい。別途権限の付与が必要になります。
APP_ROLE 設定したアプリロールの識別名を入れてください。全権限の場合は値は空で大丈夫です。
DB_ID レコード操作を行うDBのIDを設定してください。
操作するDBが複数ある場合は「DB_ID_識別名」など適宜定数を追加してください。
APP_ID レコード操作を行うDBがあるアプリのIDを設定してください。
設定値
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "アプリロール識別名");
define("DB_ID", "DBID");
define("APP_ID", "アプリID");
補足
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
上記はAPIキーの記述を「PHP環境変数設定」を利用した場合のコードとなります。
このように定数を設定する時に、ver.2 機能の「PHP環境変数設定」を利用することで、
本番環境とテスト環境でキーが異なっていても、コードを書き換える必要がなく、保守性が高まります。
APIキーなど複数ページで使用するものは、環境変数設定をしておきましょう。

その他詳しくはサポートサイト「PHP環境変数」をご参照ください。

ファイルアップロードトークン発行メソッド

ファイルアップロードトークン発行(【POST】apps/{app}/dbs/{db}/{field}/files/uploadToken )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
<?php
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "アプリロール識別名");
define("DB_ID", "DBID");
define("APP_ID", "アプリID");

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$fileFieldId = "ファイルフィールドID";
$apiUrlPass = "/apps/". APP_ID. "/dbs/". DB_ID. "/". $fileFieldId. "/files/uploadToken";

$apiResponse = $commonBase->apiCurlAction("POST", $apiUrlPass);

//------------------------------
// 共通用モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "X-Spiral-Api-Version: 1.1",
        );
        if($multiPart) {
            $header = array_merge($header, array($multiPart));
        } else {
            $header = array_merge($header, array("Content-Type:application/json"));
        }
        if(APP_ROLE){
			$header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            if ($multiPart) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        if($jsonDecode){
            return $response;
        }else{
            return json_decode($response, true);
        }
    }
}
?>
補足
ファイルアップロードメソッドを実行する際に必要になるトークンを発行することができるメソッドです。

アカウント単位で最大3個までトークンを発行可能です。すでに有効なトークンが3個発行されている状態でリクエストするとエラーとなります。
トークンは発行してから3分超過もしくは、ファイルアップロードメソッドでトークンを使用すると削除されます。

ファイルアップロードメソッド

ファイルアップロード(【POST】apps/{app}/dbs/{db}/{field}/files )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
<?php
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "アプリロール識別名");
define("DB_ID", "DBID");
define("APP_ID", "アプリID");

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$fileFieldId = "ファイルフィールドID";
$apiUrlPass = "/apps/". APP_ID. "/dbs/". DB_ID. "/". $fileFieldId. "/files";

$fileName = "ファイル名";
$fileData = "ファイルデータ";
$fileUploadToken = "ファイルアップロードトークン";

// リクエストボディ(マルチパート形式)
$requestBody = "--WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
$requestBody .= "Content-Disposition: form-data; name=\"file\"; filename=\"". $fileName. "\"\r\n";
$requestBody .= "Content-Type: text/plain\r\n\r\n";
$requestBody .= $fileData. "\r\n";
$requestBody .= "--WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
$requestBody .= "Content-Disposition: form-data; name=\"fileUploadToken\"\r\n\r\n";
$requestBody .= $fileUploadToken. "\r\n";
$requestBody .= "--WebKitFormBoundary7MA4YWxkTrZu0gW--";

$contentType = "Content-Type: multipart/form-data; boundary=WebKitFormBoundary7MA4YWxkTrZu0gW";

$apiResponse = $commonBase->apiCurlAction("POST", $apiUrlPass, $requestBody, $contentType);

//------------------------------
// 共通用モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "X-Spiral-Api-Version: 1.1",
        );
        if($multiPart) {
            $header = array_merge($header, array($multiPart));
        } else {
            $header = array_merge($header, array("Content-Type:application/json"));
        }
        if(APP_ROLE){
			$header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            if ($multiPart) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        if($jsonDecode){
            return $response;
        }else{
            return json_decode($response, true);
        }
    }
}
?>
補足
事前にトークン発行メソッドで発行したトークンを利用して、ファイルをアカウントにアップロードするメソッドです。

アップロードが成功するとレスポンスでファイルキーを取得できます。これを利用してレコード登録メソッドまたはレコード更新メソッドを実行することで、指定したDBのレコードにファイルを紐づけることができます。
レコード登録時にファイルを紐づける場合
$fileKey = "ファイルキー";
$insertData = array(
    "ファイルフィールド識別名" => array($fileKey)
);
$apiResponse = $commonBase->apiCurlAction("POST", "/apps/". APP_ID. "/dbs/". DB_ID. "/records", $insertData);
レコード更新時にファイルを紐づける場合
$fileKey = "ファイルキー";
$recordId = "更新するレコードID";
$UpdateData = array(
    "ファイルフィールド識別名" => array($fileKey)
);
$apiResponse = $commonBase->apiCurlAction("PATCH", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/". $recordId, $UpdateData);
※上記コードのように、ファイルキーを指定する際は配列に入れる必要があります。
※一括登録/更新メソッドではファイルフィールドを指定できません、レコードにファイルを紐づけしたい場合はレコード登録/更新メソッドを使用してください。
※ファイルアップロード時に指定したDBと別DBを指定して、レコード登録/更新時にファイルの紐づけを行うとエラーとなります。必ず同一DBを指定してアップロードとレコード登録/更新を行ってください。
※アップロードしたファイルをレコードに紐づけしなかった場合は、アップロードしてから1時間後に削除されます。

アップロードするファイルの具体的な記載方法は、記事内の「ファイルの記載方法」をご確認ください。

ファイルダウンロードメソッド

ファイルダウンロード(【GET】apps/{app}/dbs/{db}/{field}/{recordId}/files/{fileKey}/download )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
<?php
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "アプリロール識別名");
define("DB_ID", "DBID");
define("APP_ID", "アプリID");

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$fileFieldId = "ダウンロードするファイルフィールドID";
$recordId = "ダウンロードするファイルが登録されているレコードID";
$fileKey = "事前に取得したファイルキー";
$apiUrlPass = "/apps/". APP_ID. "/dbs/". DB_ID. "/". $fileFieldId. "/". $recordId. "/files/". $fileKey. "/download";

$apiResponse = $commonBase->apiCurlAction("GET", $apiUrlPass, "", "", "not");

//------------------------------
// 共通用モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "X-Spiral-Api-Version: 1.1",
        );
        if($multiPart) {
            $header = array_merge($header, array($multiPart));
        } else {
            $header = array_merge($header, array("Content-Type:application/json"));
        }
        if(APP_ROLE){
			$header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            if ($multiPart) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        if($jsonDecode){
			return $response;
		}else{
            return json_decode($response, true);
		}
    }
}
?>
補足
DBのレコードに登録されているファイルをダウンロードすることができるメソッドです。

事前にレコード取得メソッドもしくはレコード一覧取得メソッドを実行してファイルキーを取得する必要があります。
実行が正常に行われるとレスポンスとしてバイナリデータが返却されます。
API で取得したファイルを ver.2 でダウンロードしたい場合は、こちらの記事にサンプルが記載されていますのでご参照ください。

ver.2 でPHPの実行結果を確認する方法

ver.2 では echo などの関数が使えないため、実行結果を確認するためには Thymeleaf を使用する必要があります。
はじめは分かりにくい部分ではありますので、初歩的な確認方法を以下で解説いたします。

1.ソース設定でフリーコンテンツブロックを作成して以下の Thymeleaf を記載してください。
<div>
    <div th:if="${cp.result.isSuccess}">
        <div th:text="${cp.result.value['API_RESPONSE']}"></div>
    </div>
    <div th:if="${!cp.result.isSuccess}">
        <div th:text="${cp.result.errorMessage}"></div>
    </div>
</div>
2.作成したブロックをページに追加してください。
3.ページの「PHP」タブにコードを記載し、コード内で実行結果を Thymeleaf に渡す記載をしてください。
例:ファイルアップロードトークン発行のレスポンスを確認したい場合
//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$fileFieldId = "ファイルフィールドID";
$apiUrlPass = "/apps/". APP_ID. "/dbs/". DB_ID. "/". $fileFieldId. "/files/uploadToken";

$apiResponse = $commonBase->apiCurlAction("POST", $apiUrlPass);

// レスポンスを Thymeleaf に受け渡す
$SPIRAL->setTHValue("API_RESPONSE", $apiResponse);
上記ページを作成することで、ページURLを開くと実行結果を確認することができます。
ver.2 でPHPのデバッグをしたい場合などに活用してみてください。

ファイルの記載方法

マルチパート形式 API では下記のリクエストボディ部分でファイルに関しての記載を行っています。
// リクエストボディ(マルチパート形式)
$requestBody = "--WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
$requestBody .= "Content-Disposition: form-data; name=\"file\"; filename=\"". $fileName. "\"\r\n";
$requestBody .= "Content-Type: text/plain\r\n\r\n";
$requestBody .= $fileData. "\r\n";
$requestBody .= "--WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
これをベースにアップロードするファイルに合わせて記載を変更してください。
ファイルデータ
アップロードするファイルのデータは以下のように記載することができます。
1.ファイル関数でファイルを読み込む
指定できるファイル拡張子は、ファイルフィールドで許可されているもののみです。
$fileData = file_get_contents('ファイル');
2.文字列で直接データを記載
tcvやcsvは、タブもしくはカンマ区切りの文字列で直接データを記載することができます。
$fileData = "text,textarea,mail,number,phone\r\n"; // ファイルヘッダー 登録したいフィールド識別名を記載
$fileData .= "テキスト,テキストエリア,test@pi-pe.co.jp,100,0312345678"; // データ行 改行して登録データを記載
なお、ver.2 の PHP ではファイル関数を使用できませんのでご注意ください。
MIMEタイプ
アップロードするファイルの種類に合わせて、MIMEタイプの変更を行う必要があります。
$requestBody .= "Content-Type: text/plain\r\n\r\n"; // MIMEタイプ記載箇所

// テキストファイル
Content-Type: text/plain

// PNGファイル
Content-Type: image/png

// PDFファイル
Content-Type: application/pdf
MIMEタイプが正しくないとエラーとなる場合もありますのでご注意ください。
コンテンツに関しての
要望はこちら