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

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

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

カスタム処理を作成する

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

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

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

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] をクリックし、API一覧画面を表示します。

Image (fetched from Gyazo)

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

バリデーション処理を追加したいエンドポイントを選択し、[Pre-processing] ボタンをクリックします。

Image (fetched from Gyazo)

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

Image (fetched from Gyazo)

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

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

  • カテゴリ:API
  • コンテンツ:/rcms-api/1/original_api/sample1

Image (fetched from Gyazo)

APIの動作を確認する

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

API情報画面を表示する

API一覧画面内パンくずリストのプルダウンより [API情報] をクリックし、API情報画面を表示します。

Image (fetched from Gyazo)

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

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

Image (fetched from Gyazo)

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

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

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

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

Image (fetched from Gyazo)

レスポンスを確認する

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

Image (fetched from Gyazo)

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

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

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

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

  • APIのPre-processingとカスタム処理が関連付いているか
  • 関連付いているカスタム処理が正しいか
  • 変数名(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}

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