メインコンテンツまでスキップ

カスタム処理を利用して、APIに独自のバリデーションを実装する

カスタム処理とAPI前処理を使用して、APIに独自のバリデーション処理を実装する方法を解説します。 この機能を利用すると、標準機能のみでは実現できない複雑な入力チェックを追加できます。

今回は、POSTされたメールアドレスが特定のドメインと一致しなければエラーを返すバリデーション処理を実装します。

事前準備

APIエンドポイントを作成する

まず、エンドポイントの設定方法を参考にバリデーション処理を実装するAPIエンドポイントを作成します。 今回は「Default」のAPIに以下のエンドポイントを作成しました。

設定項目設定
パスoriginal_api/sample1
有効/無効有効
モデルカテゴリー配信
モデルMagazine
オペレーションSubscribe

Image from Gyazo

カスタム処理を作成する

バリデーション処理を記述するためのカスタム処理を用意します。

カスタム処理の一覧画面を表示する

メニューの[オペレーション] -> [カスタム処理] をクリックします。

Image from Gyazo

カスタム処理の編集画面を表示する

カスタム処理一覧画面の右上の [追加] をクリックします。

Image from Gyazo

タイトル・カテゴリを入力する

カスタム処理のタイトルとカテゴリを入力します。
今回は下記のように入力しました。

  • タイトル:/rcms-api/1/original_api/sample1
  • カテゴリ:API
  • 識別子:sample1_function
ヒント

同一カテゴリ内にタイトルが重複する処理を作成できないため、実装対象のエンドポイント名など、他と重複しないタイトルを命名してください。

Image from Gyazo

カスタム処理を保存する

一旦ここまでで保存します。 画面下部までスクロールし、[追加する] ボタンをクリックして保存します。

Image from Gyazo

バリデーション処理を記述する

次に、バリデーション処理を記述します。

カスタム処理編集画面を表示する

サイドメニューより[オペレーション]を選択し、[カスタム処理]をクリックします。

Image from Gyazo

先ほど追加したカスタム処理のタイトルをクリックします。

Image from Gyazo

カスタム処理の編集画面に戻り、エディタ内にバリデーション処理を記述していきます。

Image from Gyazo

エラー変数を初期化する

バリデーション結果を格納するための$errors変数を初期化します。

変数名説明
$errorsarrayテキスト配列

エディタに下記記入します。

{* $errors = [] *}
{assign_array var="errors" values=""}

Image from Gyazo

バリデーション処理を実装する

ユーザーの入力値をチェックし、errors変数に結果を代入します。
入力値を参照するためには、下記のいずれかの変数を利用します。

変数名説明
$smarty.getクエリパラメータ
$smarty.postJSON body
$smarty.requestクエリパラメータ & JSON body
{assign_array var="errors" values=""}

{* [例] POSTされたメールアドレスが特定のドメインと一致しなければエラーを返す *}
{if $smarty.post.email|strpos:'@example.com' === false}
{* $errors = ["メールアドレスが不正です。"] *}
{assign var="errors." value="メールアドレスが不正です。"}
{/if}

Image from Gyazo

保存する

処理の記述が完了したら、[更新する] ボタンをクリックし保存してください。
Image from Gyazo

APIにカスタム処理を関連付ける

次に作成したカスタム処理をAPIに関連付けます。

API一覧画面を表示する

[API] ->[Default] をクリックします。

Image from Gyazo

エンドポイントを選択する

事前準備で作成したエンドポイント/rcms-api/1/original_api/sample1[前処理]ボタンをクリックします。

Image from Gyazo

テーブルの下に、「カテゴリ」と「一覧」プルダウンが表示されます。

Image from Gyazo

カスタム処理を関連付ける

カスタム処理の選択プルダウンが表示されます。
先ほど作成しておいたカスタム処理のカテゴリとタイトルを選択します。

  • カテゴリ:API
  • 一覧:/rcms-api/1/original_api/sample1

Image from Gyazo

APIの動作を確認する

Swagger UI画面からリクエストを行い、バリデーション処理の動作を確認します。

Swagger UI画面を表示する

API一覧画面より [Swagger UI] をクリックし、Swagger UI画面を表示します。

Image from Gyazo

エンドポイントを選択する

バリデーション処理を実装したエンドポイント/rcms-api/1/original_api/sample1を選択し、[Try it out] ボタンをクリックします。

Image from Gyazo

エラーが出力される値を入力する

magazine_id1を入力し、バリデーション処理を確認するため、下記の通り、エラーが出力される値を[Request body]に入力します。

Request body
{
"email": "test@test.com"
}

入力が完了したら、[Execute] ボタンをクリックし、リクエストを実行します。

Image from Gyazo

レスポンスを確認する

APIのレスポンス内容を見て、想定通りのエラーが出力されることを確認します。

Image from Gyazo

{
"errors": [
{
"code": "unprocessable_entity",
"message": "メールアドレスが不正です。"
}
],
"x-rcms-request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxx"
}

以上でカスタム処理とAPIの関連付けが完了です。

バリデーションエラーが発生しない場合の確認ポイント

入力チェックが想定通りに行われない場合は、下記のポイントを確認してください。

  • APIの前処理とカスタム処理が関連付いているか
  • 関連付いているカスタム処理が正しいか
  • 変数名(errors)が正しいか
  • チェック対象の項目名が正しいか
  • バリデーション処理のロジックが正しいか

コード例の紹介

カスタム処理に利用できるコード例を紹介します。

特定の文字列を含むかどうかをチェックする

{if $smarty.post.column_name|strpos:"期待する文字列" === false}
{assign var="errors." value="column_nameが不正です。"}
{/if}

数値かどうかをチェックする

{if !$smarty.get.parameter_name|is_numeric}
{assign var="errors." value="parameter_nameは数値で入力してください。"}
{/if}

特定の項目に依存した入力チェックを行う

{*
[例] ext_col_01に1が入力された場合のみ、ext_col_02を必須項目とする
ext_col_01: セレクト項目 ('', '1', '2')
ext_col_02: テキスト項目
*}
{if $smarty.post.ext_col_01 === '1' || (
!$smarty.post.ext_col_01|@empty &&
$smarty.post.ext_col_01.key === '1'
)}
{if !isset($smarty.post.ext_col_02) || $smarty.post.ext_col_02 === ''}
{assign var="errors." value="テキスト項目は必須項目です。"}
{/if}
{/if}

特定のグループに所属するメンバーにのみ入力チェックを適用する

{if $smarty.session.arrGroup_id|@is_array &&
101|in_array:$smarty.session.arrGroup_id}
{if !isset($smarty.post.column_name)}
{assign var="errors." value="column_nameは必須項目です。"}
{/if}
{/if}

エラー時にレスポンスコードを変更する場合

エラーチェックによってエラー応答する際に、APIのレスポンスコードを
特定のエラーコードに変更してエラーレスポンスを行いたい場合は下記のように設定します。

{assign var=http_code value=404}

利用可能なHTTPコード

コード名称意味
400Bad Requestクライアントからのリクエストが不正
401Unauthorizedユーザー認証が無い(未ログイン)ことによるリクエスト失敗
403Forbiddenコンテンツへのアクセス権が無いためにリクエスト失敗(401とは異なりユーザー認証は完了している)
404Not Found指定されたエンドポイントのコンテンツが存在しないことによるリクエスト失敗
408Request Timeoutリクエストがタイムアウトした場合のエラー
500Internal Server Errorクライアントからのリクエストは正しいが、サーバ側でエラーが発生した場合のエラー

errorsにエラーメッセージを設定する方法と組み合わせることも可能です。
設定例)

{if `エラー判定処理`}
{assign var=http_code value=404}
{assign_array var=errors values=''}
{assign var=errors. value='コンテンツが存在しません'}
{/if}

レスポンス例)

HTTP Respnese code: 404

Response body
{
"errors": [
{
"code": "unprocessable_entity",
"message": "コンテンツが存在しません"
}
],
"x-rcms-request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxx"
}

サポート

お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。