API Connect のアセンブルでGatewayScript処理を共通化


はじめに

API ConnectではAPI毎にパス等の設定や動作(アセンブル)を定義します。
アセンブルでは、ポリシーを1個以上配置し、APIの動作を定義しますが、
GatewayScriptポリシーというJavaScriptライクな言語で処理を実装可能なポリシーが存在します。

今回は、複数のGatewayScriptポリシーで、似たような処理を実装するんだけど、どうやって共通化するんだけっけ? みたいなお悩みにお答えする記事になっています。

環境

IBM CloudのAPI Connectサービスで動作確認しています。

アセンブル定義

今回、下図のアセンブルを定義しました。
このAPIでは、get/trimとget/trim2 の2パスの処理を定義しています。
赤枠のtrim body、trim body2が処理を共通化したいGatewayScriptポリシーです。

GatewayScript(共通化前)

今回のtrim bodyおよびtrim2 bodyには、例として、「APIレスポンスのトリム処理」を実装します。


// get http body
var httpBody = apim.getvariable('message.body');

// trim 
Object.keys(httpBody).forEach(function(key) {
  var value = httpBody[key];
  if (typeof(value) == 'string') {
    httpBody[key] = value.replace(/ +$/g, '');
  }
});

// set http body
apim.setvariable('message.body', httpBody);

プロパティー

さて、このトリム処理を共通化するためには、どうすればよいでしょうか?
答えの一つがプロパティーを利用する方法です。

プロパティーとは固定値をなど定義し、アセンブルから参照させる場合によく利用します。
ここでは、共通化したい処理を関数として定義してしまいます。
図、右下の値フィールドに、コードを記述します。

ただ、設計ビューでは、コーディングしづらいので、ソースビューを利用することをお勧めします。
今回は、「trimFunction」というプロパティー名で無名関数としてトリム処理を定義しています。

GatewayScript(共通化後)

プロパティーを利用したGatewayScriptポリシーのコーディングは、以下の通りです。
$(trimFunction)で、プロパティーから関数を取得しています。


// get http body
var httpBody = apim.getvariable('message.body');

// trim
var trimFunction = $(trimFunction);
trimFunction(httpBody);

// set http body
apim.setvariable('message.body', httpBody);

最後に

今回は、プロパティーに共通化したい処理を関数として定義し、複数のGatewayScriptポリシーで利用する方法をご紹介しました。

GatewayScriptを利用するシーンとしては、アクセスログを出力するケースが挙げられます。
アクセスログは、開始時、終了時の2個所で出力しますが、それらの処理を共通化する場合に今回の方法が利用できます。