[CAIレシピ] 動的なURIを使用するサービス接続

## はじめに

[CAIプロセス実行時のリクエストメソッド(GET, POSTなど)やResourcePathを取得する](https://qiita.com/shunsuzu/private/98e26b0c23f66add4c7a)ではURIを動的に指定可能なCAIプロセスの実装を確認しました。この記事では、動的なURIを使用するサービス接続の実装を確認します

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)
- [CAIプロセス実行時のリクエストメソッド(GET, POSTなど)やResourcePathを取得する](https://qiita.com/shunsuzu/private/98e26b0c23f66add4c7a)
- [サービス接続によるREST APIの実行](https://qiita.com/shunsuzu/private/f2783c55a4d75661fc0b)


## 動的なURIを使用するサービス接続の使用
### サービス接続の作成

次の手順では[CAIプロセス実行時のリクエストメソッド(GET, POSTなど)やResourcePathを取得する](https://qiita.com/shunsuzu/private/98e26b0c23f66add4c7a)で作成した __recipe-pca-functionVerbResourcePath__ を呼び出すサービス接続を作成しています。

1. サービス接続を次の設定で作成します。
    - 名前を __recipe-svcConn-dinamicURI__ とする
    - アクション __getAction__ を追加する

1. __アクション__ タブ、__入力__ タブを選択して、入力フィールドを __名前=path__、__タイプ=テキスト__、__テストに使用する値=TestPath1/TestPath2__ として定義します(ここで定義した入力フィールドは、CAIプロセスでこのサービス接続を使用する際の入力フィールドとなります)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/6db52039-1517-ad26-e087-e12c6fa176c2.png)

1. __バインディング__ タブを選択して __URL__ に[CAIプロセス実行時のリクエストメソッド(GET, POSTなど)やResourcePathを取得する](https://qiita.com/shunsuzu/private/98e26b0c23f66add4c7a)で作成した __recipe-pca-functionVerbResourcePath__ のサービスURLに`/{$path}`を加えた文字列を指定します。`/{$path}`は定義済みの入力フィールドです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/3b98bf5a-c39f-c62e-ad49-f857241fbaa5.png)

1. __テスト結果__ タブを選択して、__テスト__ を実行、次のように3つのフィールドが得られる動作を確認できたら __プロセスオブジェクトの生成__ を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/105c0dad-d995-3b3c-4636-5d0de7f8667c.png)

1. __出力__ タブを選択、出力フィールドの追加ボタンをクリックして、出力フィールドを次のように設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/9e549006-b984-e7ae-0b6c-fcff0510ffb4.png)

1. 作成したサービス接続を 保存 して パブリッシュ を実行します。

### アプリケーション接続の作成

1. アプリケーション接続を次の設定で作成します。
    - 名前を __recipe-appConn-svcDinamicURI__ とする
    - タイプを __recipe-svcConn-dinamicURI__ とする
1. 保存、パブリッシュ を実行します。

### CAIプロセスの作成
次の手順では作成したサービス接続・アプリケーション接続を利用するCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名称を __recipe-pca-svcDinamicURI__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 入力フィールド __input1__,__input2__ を __タイプ=テキスト__ として定義します。

1. 出力フィールド __output__ を定義します。__タイプ__ はサービス接続で作成したプロセスオブジェクトを次のように指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/ae7a873e-90d9-5580-0609-8dc15fa6ac02.png)

1. 一時フィールド __tmpPath__ を __タイプ=テキスト__ として定義します。

1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/98b819e7-7a15-a239-42d5-90ae64c08a65.png)

1. 割り当てステップを選択して一時フィールド __tmpPath__ に __計算式__ として `if ($input.input2 = "") then $input.input1 else concat($input.input1, "/", $input.input2)` を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/e17d7cd8-dcfd-8a4e-3a42-3e461e18fe34.png)
なお、計算式は次の内容をChatGPTに伝えて生成してもらったコードを元としています。
    > XQueryで次のコードを書いてほしいよ
    >     - tmpPath、input1、input2というテキスト型の変数があるよ
    >     - input1とinput2をスラッシュ区切りで連結してほしいよ
    >     - input2が空文字の場合には、区切り文字(スラッシュ)は不要だよ

1. サービスステップを選択して、次のように設定します。
    - __サービスタイプ__ を __接続__ とする
    - __接続__ を __recipe-appConn-svcDinamicURI__ とする
    - __アクション__ を __getAction__ とする

1. サービスステップの __入力フィールド__ タブを選択して、入力フィールド __path__ に一時フィールド __tmpPath__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/94b3a97c-4efb-c4c0-2d62-0846b6544fef.png)

1. 割り当てステップを選択して、出力フィールド __output__ にサービス接続の出力フィールド __getActionOut__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/70fdc88b-7c6c-1c9e-72ee-72e6e532e64f.png)

### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。入力フィールドの違いにより、出力フィールドが変わる動作を確認できます。

```:curlコマンドと実行結果
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-svcDinamicURI

//実行結果
{"output":{"outVerb":"GET"}}
```

```:curlコマンドと実行結果
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-svcDinamicURI \
-H 'Content-Type: application/json' \
-d '{
"input1": "AAA"
}'

//実行結果
{"output": {
  "outVerb": "GET",
  "outPath1": "AAA"
}}
```

```:curlコマンドと実行結果
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-svcDinamicURI \
-H 'Content-Type: application/json' \
-d '{
"input1": "AAA",
"input2": "BBB"
}'

//実行結果
{"output": {
  "outVerb": "GET",
  "outPath1": "AAA",
  "outPath2": "BBB"
}}
```

## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)