[OutSystems]Consume REST APIのカスタマイズを試してみる

OutSystemsから、Server Actionであるかのように外部のREST APIを呼べるようにするConsume REST APIの機能の話題です。
REST APIを呼ぶ直前に処理を挟むOn Before Requestというタイミングと、REST APIから処理が帰ってきた直後に処理を挟むOn After Responseというタイミングがあります。

# ドキュメント
この項目は記述がだいぶ薄いですが、以下のページが該当します。
[シンプルなカスタマイズ](https://success.outsystems.com/ja-jp/Documentation/11/Extensibility_and_Integration/REST/Consume_REST_APIs/Simple_Customizations)

# OnBeforeRequest
Consume REST APIのメソッドに実際にHTTP通信を送信する直前に動作し、リクエストを書き換えできる機能です。
REST APIのOn Before Requestプロパティの「New OnBeforeRequest」を選択すると、対応するActionが自動生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4178b1ef-57a9-f57e-b90b-b96823d4180f.png)

Requestに入っているのが元々の値で、これをカスタマイズした値をCustomizedRequestに設定することで上書きできます。


## パラメータの属性
現時点（2021/3/16）ではドキュメントに記述がないので、各属性について観察した結果をまとめておきます。
名前とデバッガで止めて確認した内容をまとめると以下のようになります。

| 属性名 | 型 | 内容（推測） |
|:-:|:-:|:-:|
| BaseURL | Text | 呼び出すAPIのURL（クエリストリングは含まない） |
| URLPath | Text | APIメソッドの相対パス  |
| HTTPMethod | Text | HTTPメソッド。GETとかPOSTとか  |
| RequestText | Text | HTTPリクエストボディ  |
| RequestBinary | BinaryData | HTTPリクエストボディ（バイナリ表現） |
| URLQueryParameters | List（NameとValue）  | クエリストリングのリスト |
| Headers | List（NameとValue） | ヘッダのリスト |

## 値を上書きしてみる
ここではわかりやすいRequestTextの書き換えをやってみます。
これはHTTPリクエストボディの値が入る属性であるため、POSTでリクエストするメソッドでテスト。

Input Parameterで整数値を受取り、それに4をかけた値を返すREST APIを別途用意します。
そのAPIをConsumeして、さらにOnBeforeRequestを追加。RequestTextの末尾に1を追加（文字列として"1"を結合）する処理を足してどうなるか確認してみました。

入力値（デバッガ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/99109533-884d-7720-f0da-daf6508be8c0.png)

出力値（修正なし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b4dc7a62-4b6e-8e8f-df82-c0fe773a35a6.png)

出力値（OnBeforeRequest修正後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f9edfeec-7101-a22f-2abe-d9144d2a0f08.png)
想定通り34 * 4 = 136 -> 341 * 4 = 1364になっています。

OnBeforeRequestの修正後ロジック
CustomizedRequestの値は、OnBeforeRequestが始まった段階では空なので、一旦RequestをAssignしたほうがよさそうです。
その後で目当てのCustomizedRequest.RequestTextにAssignします。

```
CustomizedRequest.RequestText = CustomizedRequest.RequestText + "1"
```

## OnBeforeRequestで変更できないパターン
この方法では一部行えない変更があると書いてあります。
以下はドキュメントからの引用です。
> このシンプルなカスタマイズ方法では、HTTPヘッダーを追加することや値を変更することはできますが、既存のヘッダーを削除することはできません。HTTPヘッダーを削除する場合は、OutSystems REST Extensibility APIを使用する必要があります。詳細については、「高度なカスタマイズ」をご覧ください。

ヘッダーから項目を削除することができないらしいので試してみます。

OnBeforeRequestを以下のように変更してみました。
ヘッダの先頭を削除しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5fd88ad8-0527-b1be-fdf8-f7f2c6d86a79.png)

デバッガで止めてみると、ヘッダの先頭であるUser-Agentが削除されているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c1377ceb-da8a-0c32-7503-9a316ace4a8d.png)

ところが、Consumeで呼びに行く先のExpose REST APIで詳細なログを出してみると、消したはずのUser-Agentが記録されていました。ドキュメントの記述と照らし合わせると、削除しても無視されるということでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/524c4cec-b13c-18f1-dde7-183ccba3b6f8.png)

ドキュメントで言う、「高度なカスタマイズ」に対応しているのは、「OnBeforeRequest(Advanced)」です。.NETで操作できるREST Extensibility APIというものがあってそこで「高度なカスタマイズ」ができるとのこと。

# OnAfterResponse

## パラメータの属性

| 属性名 | 型 | 内容（推測） |
|:-:|:-:|:-:|
| StatusCode | Integer | HTTPステータスコード。200とか404。整数値なのに注意  |
| StatusLine | Text | HTTPレスポンスの先頭に出てくるやつです。「<HTTPステータスコード> <HTTPステータスコードの文字表現>」 |
| ResponseText | Text | HTTPレスポンスボディ |
| ResponseBinary | BinaryData | HTTPレスポンスボディ（バイナリ表現） |
| Headers | List（NameとValue）  | ヘッダのリスト |