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


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

ドキュメント

この項目は記述がだいぶ薄いですが、以下のページが該当します。
シンプルなカスタマイズ

OnBeforeRequest

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

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"を結合)する処理を足してどうなるか確認してみました。

入力値(デバッガ)

出力値(修正なし)

出力値(OnBeforeRequest修正後)

想定通り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を以下のように変更してみました。
ヘッダの先頭を削除しています。

デバッガで止めてみると、ヘッダの先頭であるUser-Agentが削除されているのがわかります。

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

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

OnAfterResponse

パラメータの属性

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