Azure API ManagementでAPIを定義するときに、フロント側はお作法に従ってPath Parameterを使いたいのだけど、バックエンド側がそれに対応していなかったときのメモ。
フロントでは /books/{isbn}
で受け取っていて、バックエンドにはQuery Paramter q=isbn:{isbn}
のように渡したい。
このような場合、API ManagementではPolicyと呼ばれる設定で各種のデータ加工、パラメータ変換、バリデーションなどを行える。
今回もPath ParameterからQuery Parameterに書き換えるためにPolicyを追加した。この書き方が少し慣れなかったので、メモを残しておく。
Inbound processing にポリシーを追加
Backendのポリシーは重ね掛けできないので、Inbound processingでポリシーを追加していく。
ここでは以下2つのポリシー追加が必要
- Set Query string parameter
- Rewrite URI
順序に注意。
1. Query Parameter追加
1つめはPath Parameterで入ってくる {isbn}
をQuery Parameterのほしい形に加工するために追加している。
Policy ではC#の表現が利用できる。単純な値を返す場合には、「Set query paramters」のVALUEとして、@(ここに返す値)
を記載する。一行で書ける式ならこれでOK。
一方で複数行にわたる式を使って返す値を定義する場合には@{...}
を使って
@{ string[] value; if (context.Request.Headers.TryGetValue("Authorization", out value)) { if(value != null && value.Length > 0) { return Encoding.UTF8.GetString(Convert.FromBase64String(value[0])); } } return null; }
のように記載する。
Azure API Management policy expressions | Microsoft Docs
今回のケースではURLの一部と固定の文字を結合してQuery Parameterを定義したかったので、
@("isbn:"+ (string)context.Request.Url.Path.Split('/').Last())
このように書いた。
なお、context...については、Context変数で、以下のページにすべて書いてある。
今施したのは、context.Request.Url.Path (=リクエストURLのPath部分) を / で分割した最後 の前に"isbn:"を追加という処理。
2. URIの書き換え
URL書き換えにはRewrite URLのポリシーを追加する。
フロント側から来たリクエストのMethodとURLを書き換えてバックエンド (後ろでリクエストを渡すサービス側) に渡せる。
ここではMethodは変更せずにGET、URLを、サービスに合わせてPath Parameterを含まないように再定義した。
おわり
なお、上記2つを含め、ポリシーの全体はXMLで以下のように書き表せる
<policies> <inbound> <base /> <set-query-parameter name="q" exists-action="append"> <value>@("isbn:"+ (string)context.Request.Url.Path.Split('/').Last())</value> </set-query-parameter> <rewrite-uri template="/books/v1/volumes" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
このほかにも、入ってきたパラメータのバリデーションもInbound processingのポリシーでおこなったり、他にも決まったヘッダーを追加するということもPolicyで可能。
困ったら参考にするのは公式のDocs
またはAPI Management全体については上坂貴志さんのマニュアルが詳しい。
www.slideshare.net