MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

メモ:Azure API ManagementでPath ParamterからQuery Paramterに変換するポリシー

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つのポリシー追加が必要

  1. Set Query string parameter
  2. 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;

}

のように記載する。

f:id:mofumofu_dance:20201113140549p:plain

Azure API Management policy expressions | Microsoft Docs

今回のケースではURLの一部と固定の文字を結合してQuery Parameterを定義したかったので、

@("isbn:"+ (string)context.Request.Url.Path.Split('/').Last())

このように書いた。

なお、context...については、Context変数で、以下のページにすべて書いてある。

https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ContextVariables

今施したのは、context.Request.Url.Path (=リクエストURLのPath部分) を / で分割した最後 の前に"isbn:"を追加という処理。

2. URIの書き換え

URL書き換えにはRewrite URLのポリシーを追加する。

フロント側から来たリクエストのMethodとURLを書き換えてバックエンド (後ろでリクエストを渡すサービス側) に渡せる。

f:id:mofumofu_dance:20201113141604p:plain

ここでは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

docs.microsoft.com

またはAPI Management全体については上坂貴志さんのマニュアルが詳しい。

www.slideshare.net