OutSystemsでREST APIを作って公開するExpose REST APIの機能には、プリプロセスを行えるOnRequest、ポストプロセスを行えるOnResponseというプロパティがあります。
OnRequest(前処理)の動作を確認してみました。
ExposeしたREST APIで、各メソッドの処理を開始する前に動作するActionを作れる機能です。
入力パラメータをText型またはBinary型として受取り、その値を修正して出力パラメータに設定することで前処理できます。
確認環境
Personal Environment(Version 11.10.0 (Build 22910))
Service Studio(Version 11.10.13)
ドキュメント
操作対象はBODY
パラメータを渡す方法として、URL(クエリストリング)・Header・Bodyがあります。
OnRequestで操作できるのはリクエストデータの内、BODYの部分だけのようです。OnRequestは各個別メソッドより前に動作するため、メソッドでどういうパラメータを指定しているかは関係ないはずですが、念の為確認してみました。
URL渡しのパラメータは操作できないのでGETは対象外
HTTP Method=GET、かつ入力パラメータをURLで受け取るメソッドを作って以下のパラメータで動作確認。
<モジュールパス>/rest/SampleExposedAPI/RESTAPIMethod2?Message=%E3%83%86%E3%82%B9%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8&Number=123&dummy=2012
この条件で入力パラメータをデバッガで確認したところ、空文字列でした。よって、GET MethodのAPIにはこのカスタマイズは使えなさそうです。
POSTのAPIに渡したパラメータが、OnRequestでどのように見えるか
Chrome ExtensionのRestManで確認してみます。
用意したメソッドは、HTTP Method=POSTで、Receive In=Bodyの入力パラメータはStructure(Text型のMessageとInteger型のNumber属性を持つ)という構成。
指定したヘッダ(複合型を渡すときはContent-Type:application/jsonを渡す必要がある):
指定したリクエストボディ:
{
"Message": "メッセージテキスト",
"Number": 123,
"DummyData": "DummyText"
}
OnRequestのRequest入力パラメータに渡ってきたデータ(デバッガで確認):
渡したリクエストボディがそのまま、Request.RequestText属性に入っているようですね。
また、ヘッダで渡した値は、やはりRequestには入っていないようです。
Request.RequestBinaryの正体
OnRequestの入力パラメータRequestには、ここまで見てきたRequestTextの他に、RequestBinaryという属性もあります。
上の項目と同じパラメータを使って、RequestBinaryを確認してみます。
この属性はBinary型なので、OnRequest中で、BinaryDataモジュールのBinaryDataToTextを使ってText型に戻して値を確認してみます。1
Encodingを指定しておきます(ないと、ASCIIとして解釈してしまうので)。
変換してみた結果。完全に入力(リクエストボディ)と一致していますね。入力データのバイナリデータ表現ということですね。
前処理でパラメータを書き換えてみる
実験として、OnRequest内で受け取った値を変更してみたらどうなるかを確認してみます。
やり方としては、
- JSON Deserializeする(REST APIメソッドで受け取りに使っている型)
- 変数の1つを上書き
- JSON Serializeする
- 結果をRequest.RequestTextに編集
- デバッガを使ってREST APIメソッドに渡ってきた値を確認
-
使い方は以前書いたOutSystemsでShift-JISやEUC-JPのデータを扱うを参照 ↩