API開発の際に、バックエンドはまだできていないけど、とりあえず仮のレスポンスを受け取りたいことがあると思います。AzureのAPI Managementを利用では、レスポンス内容が固定であれば「モック応答ポリシー」を使うことで簡単に設定できます。しかし、レスポンス内容を動的にしたい場合は「モック応答ポリシー」は使えず、少し工夫が必要です。そこで、動的レスポンスを返却するmockの設定について紹介します。
結論
下記2つのポリシーを組み合わせることで、動的なmockを作成できます。
- 変数設定ポリシー(set-variable)
- ボディ設定ポリシー(set-body)
基礎知識
API Managementのポリシー
API Managementはクライアントとバックエンドの間に位置し、基本的には相互のやり取りを仲介します。この際、ポリシーを使うことでクライアントからのリクエストやバックエンドからのレスポンスに変更を加えることができます。例えば、クライアントから受信したリクエストに特定のヘッダーを追加したり、バックエンドからのレスポンスに値を追加することができます。
モック応答ポリシー
「モック応答ポリシー」を使うと簡単にmockを作成できます。レスポンスコードやレスポンスボディを好きなように設定できます。しかし、レスポンスボディの値を動的に変更することはできません。例えばリクエストIDなど毎回ランダムな値を返却したい場合は「モック応答ポリシー」は使えないので、他のポリシーを組み合わせてmockを作成することになります。
動的mockの作成
期待するレスポンスボディ
今回は、以下のように毎回ランダムな12桁の数値を持つリクエストIDを含むデータを返却すると想定して話を進めます。
{
"requestId": 123456789012, ←リクエストごとに値が変動
"resultCode": 0
}
「変数設定ポリシー」と「ボディ設定ポリシー」
上記の2つのポリシーを組み合わせることで動的なデータを返却するmockを実現します。まず「変数設定ポリシー」ですが、このポリシーを使って毎回ランダムな値を設定します。今回はランダムな12桁の数値ですので単純に現在時間を利用していますが、この辺は目的に合わせて変更してください。
続いて「ボディ設定ポリシー」を作成します。このポリシーでレスポンスボディを上書きします。set-variableで作成した変数は「context.Variables[“変数名”]」という形でset-body内部で参照できます。
最終的にポリシーは以下のようになります。
<policies>
<inbound>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-variable name="updateTime" value="@(System.DateTime.UtcNow.ToString("ddMMHHmmssff"))" />
<set-body template="liquid">{"requestId":"{{context.Variables["updateTime"]}}","resultCode":0}</set-body>
</outbound>
<on-error>
<base />
</on-error>
</policies>
Azure Portal上で見ると以下のように設定されています。
注意点
「変数設定ポリシー」と「ボディ設定ポリシー」はoutboundに設定します。ちなみに「モック応答ポリシー」はinboundに設定します。「モック応答ポリシー」が設定されていると、outboundまで処理が回りませんので、削除しておいてください。
またポリシーで複雑な処理を記述すると、パフォーマンスに影響が出る可能性があるので注意しましょう。
コメント