[CAIレシピ] CAIプロセス実行時のリクエストメソッド(GET, POSTなど)やResourcePathを取得する

## はじめに

例えばユーザー情報を参照・管理するAPI実装時には、次のような要件を満たす処理を1つのCAIプロセスで実装できたら便利ですよね？

- 参照する場合(GET)と、新規登録する場合(POST)で同じCAIプロセスを実行したい
- /user/123という形式簡単で社員情報を参照できるようにCAIプロセスを実行したい
(`この例ではusersがAPI名、123が社員番号`)

この記事にて紹介している情報および[ディシジョンステップによるによる分岐処理](https://qiita.com/shunsuzu/private/cf69000890ccdfd1d42f)を理解することで上記のような条件に応じた処理を実装できるようになります。


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

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)


## リクエストメソッドとResourcePathの取得

### リクエストメソッドとは?
HTTP Requestを実行する際にはGETやPOSTというキーワードを指定しますよね。これがリクエストメソッドに該当します。参考までの情報となりますがリクエストメソッドには主に次のようなメソッドがあります。
|メソッド|SQL的表現|概要|
|:-:|:-:|-|
|GET|SELECT|リソースの参照|
|POST|INSERT/EXECUTE|リソースの新規作成、処理の要求|
|PUT|UPDATE|リソースの更新(全体の更新)|
|PATCH|UPDATE|リソースの更新(一部の更新)|
|DELETE|DELETE|リソースの削除|

### ResourcePathとは?
URIは一般的に次のような構造です。

```:URIの構造
<Scheme>://<HostName>:<PortNumber>/<ResourcePath>?<QueryParameter>

Scheme        ：通信プロトコル(例、httpやhttps)
HostName      ：サーバーのアドレス、FQDN
PortNumber    ：サーバーのポート番号
ResourcePath  ：サーバー上のリソースの場所
QueryParameter：リソースに対する追加情報
```
上記のようにURIはスラッシュ(/)で各要素が区切られています。そして、ResourcePathには複数のスラッシュが含まれている場合があります。例えば、IICSのREST API(user)を例にResourcePathを確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/f040e6c4-9287-fa2f-42d1-f746a64fb0f1.png)

このREST API(user)のResourcePathは `saas/api/v2/user`および`saas/api/v2/user/<id>`および`saas/api/v2/user/name/<name>`です。これらのREST APIはそれぞれ、ユーザー情報全体を取得したい場合、id情報で情報取得したい場合、名称で情報取得したい場合に使えるだろうと __直感的__ に理解できます(APIの利用者が __直感的__ に理解できるというポイントが重要)。

CAIプロセスの実装においても、IICSのREST API(user)のように共通するResourcePathを提供して処理を実装できます(リソース指向、RESTful APIに基づいた実装)。


### CAIプロセスの実装

次の手順では、リクエストメソッド・ResourcePathを取得するCAIプロセスを作成しています。

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

1. 出力フィールド __outVerb__,__outPath1__,__outPath2__ を __タイプ=テキスト__ として定義します。

1. 割り当てステップを選択して、次のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/bbcfb2c3-610f-e2ea-07b3-54dc94dd2884.png)


    <table>
      <tr>
          <th>フィールド</th>
          <th>割り当て</th>
          <th>値</th>
          <th>概要</th>
      </tr>
      <tr>
          <td>outVerb</td>
          <td>計算式</td>
          <td>request:getRequestHTTPVerb()</td>
          <td>リクエストメソッドを取得</td>
      </tr>
      <tr>
          <td>outPath1</td>
          <td>計算式</td>
          <td>request:getResourcePathSegments()[1]</td>
          <td>1つ目のリソースパスを取得</td>
      </tr>
      <tr>
          <td>outPath2</td>
          <td>計算式</td>
          <td>request:getResourcePathSegments()[2]</td>
          <td>2つ目のリソースパスを取得</td>
      </tr>
    </table>
### CAIプロセスの実行

CAIプロセスを実行すると、実行時のリクエストメソッドやResourcePathに応じて得られる結果が変わる動作を確認できます。

```:シンプルなGETリクエスト
curl \
https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-functionVerbResourcePath

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

```:POSTリクエスト+ResourcePathを追加した実行
curl -X POST \
https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-functionVerbResourcePath/AAA

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

```:POSTリクエスト+ResourcePathを2つ追加した実行
curl -X PUT \
https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-functionVerbResourcePath/AAA/BBB

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

今回はリクエストメソッドやResourcePathの指定値を確認しましたが、[ディシジョンステップ](https://qiita.com/shunsuzu/private/cf69000890ccdfd1d42f)を使うことで、リクエストメソッドやResourcePathに応じた分岐処理を実装できます。

## 参照

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