条件リファレンス

条件を使用すると、ランタイムに API プロキシの動作を動的に制御できます。条件では変数に対するオペレーションを定義します。この条件は、Apigee Edge 処理パイプラインで評価されます。条件文は boolean 型で、常に true または false と評価されます。

条件文での変数の使用

条件文では、組み込みのフロー変数だけでなく、カスタム変数も使用できます。組み込み変数の一覧については、フロー変数のリファレンスをご覧ください。手順については、ExtractVariables ポリシーでカスタム変数の設定方法をご覧ください。

条件文の構造

条件文の基本的な構造は次のとおりです。

    <Condition>{variable.name}{operator}{"value"}</Condition>
    

例:

    <Condition>request.verb = "GET"</Condition>
    

条件はチェーンで連鎖できます。たとえば、次の条件は、リクエストの URI が /statuses に一致し、リクエストの HTTP 動詞が GET の場合にのみ true に評価されます。

    <Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
    

または

    (proxy.pathsuffix MatchesPath "/statuses") and (request.verb != "GET")
    

条件文の使用場所

条件を使用することで、条件付きの制御を実装し、動作を制御できます。

  • ポリシーの実行
  • フローの実行
  • ターゲット エンドポイントのルート選択

ポリシーの実行

条件文を使用すると、ポリシーの適用を制御できます。よく使われる例としては、HTTP ヘッダーまたはメッセージのコンテキストに基づいて、レスポンス メッセージを条件付きで変換します。

たとえば、Accept ヘッダーに基づいて XML から JSON に条件付きで変換を行います。

    <Step>
      <Condition>request.header.accept = "application/json"</Condition>
      <Name>XMLToJSON</Name>
    </Step>
    

フローの実行

条件文を使用すると、ProxyEndpoints と TargetEndpoints で名前付きのフローの実行を制御できます。条件付きで実行できるのは名前付きのフローだけです。トランザクションごとに、ProxyEndpoints と TargetEndpoints のプレフローとポストフロー(リクエストとレスポンスの両方)を実行し、無条件の 'failsafe' 機能を実行できます。

たとえば、リクエスト メッセージの HTTP 動詞に基づいて条件付きのリクエスト フローを実行し、エラーを表す HTTP ステータス コードに基づいて条件付きのレスポンス フローを実行するには、次のように指定します。

    <Flow name="GetRequests">
      <Condition>request.verb = "GET"</Condition>
      <Request>
        <Step>
          <Condition>request.path MatchesPath "/statuses/**"</Condition>
          <Name>StatusesRequestPolicy</Name>
        </Step>
      </Request>
      <Response>
        <Step>
          <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
          <Name>MaintenancePolicy</Name>
        </Step>
      </Response>
    </Flow>
    

ターゲット エンドポイントのルート選択

条件文を使用すると、プロキシ エンドポイントの構成で呼び出されるターゲット エンドポイントを制御できます。ルートルールに従ってリクエストが特定のターゲット エンドポイントに転送されます。複数のターゲット エンドポイントが使用できる場合、ルートルールの条件が評価されます。true の場合、指定されたターゲット エンドポイントにリクエストが転送されます。

たとえば、条件を評価し、Content-Type に基づいて特定のターゲット エンドポイントにメッセージをルーティングするには、次のように記述します。

    <RouteRule name="default">
     <!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
      <Condition>request.header.Content-Type = "text/xml"</Condition>
      <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
    </RouteRule>
    

詳細については、フローの変数と条件をご覧ください。

パス式

パス式は URI パスの照合に使用します。"*" は 1 つのパス要素を表し、"**" は複数の URI レベルを表します。

例:

パターン 一致する URI パスの例
/*/a/ /x/a/ または /y/a/
/*/a/* /x/a/b または /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ または /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

% は、エスケープ文字として扱われます。パターン %{user%}{user} に一致しますが、user には一致しません。

条件は次のように分類されます。

  • 演算子: 条件で使用されるワイルドカード パターン。
  • 関係オペランド: 数量が別の数量と等しいか、大きいか、小さいかを評価します。
  • オペランド: 全体の値を特定するために使用される条件値。
  • リテラル: 条件内のリテラル値。

演算子

演算子を使用する場合は、次の制限事項に注意してください。

  • 演算子を変数名として使用できません。
  • 演算子の前後にはスペース文字が 1 個必要です。
  • 変数内で演算子を使用する場合は、演算子を一重引用符で囲む必要があります。例: 'request.header.help!me'
  • 算術演算子(+, *, -, /, %)は使用できません。
  • 演算子には Java の優先順位が適用されます。
  • Apigee Edge では、java.util.regex で実装されている正規表現を使用します。
記号 文字表現 説明
! Not、not 単項演算子(1 個の入力が必要)
= Equals、Is 等しい(大文字と小文字を区別)
!= NotEquals、IsNot 等しくない(大文字と小文字を区別)
:= EqualsCaseInsensitive 等しい(大文字と小文字を区別しない)
> GreaterThan より大きい
>= GreaterThanOrEquals 以上
< LesserThan より小さい
<= LesserThanOrEquals 以下
&& And、and および
|| Or または
( 式のグループ
) 式のグループの終わり
~~ JavaRegex

javax.util.regex 準拠の正規表現に一致します。大文字と小文字が区別されます。例については、条件文のパターン マッチングをご覧ください。

~ Matches、Like glob スタイルのパターンに一致します。"*" ワイルドカード文字を使用します。大文字と小文字が区別されます。例については、条件文のパターン マッチングをご覧ください。
~/ MatchesPath、LikePath パス式と照合します。大文字と小文字が区別されます。例については、条件文のパターン マッチングをご覧ください。
=| StartsWith 文字列の先頭文字を照合します。大文字と小文字が区別されます。

条件文での NULL オペランドの動作

次の表に、オペランドの左側(LHS)の値または右側(RHS)の値が NULL の場合、条件が true または false に評価されるかどうかを示します。

演算子 LHS が NULL RHS が NULL LHS と RHS が NULL
=、==、:= false false true
=| false false false
!= true true false
> true false false
>= false true true
< true false false
<= true false true
~ false なし false
~~ false なし false
!~ true false false
~/ false なし false

オペランド

比較を行う前に、Apigee Edge はオペランドを共通のデータ型に適合させます。たとえば、レスポンスのステータス コードが 404 の場合、式 response.status.code = "400" と response.status.code = 400 は同じになります。

数値オペランドの場合、値の最後が次の場合を除き、データ型は integer と解釈されます。

  • "f" または "F"(float、例: 3.142f、91.1F)
  • "d" または "D"(double、例: 3.142d、100.123D)
  • "l" または "L"(long、例: 12321421312L)

この場合、次の表のような適合が行われます。

注: 表内のダッシュ(-)は比較が行われないことを意味します。したがって、比較は false になります。

RHS LHS Boolean Integer Long Float Double String Comparable Object
Boolean Boolean Integer Long Float Double String -
Integer Integer Integer Long Float Double String Comparable -
Long Long Long Long Float Double String Comparable -
Float Float Float Float Float Double String Comparable -
Double Double Double Double Double Double String Comparable -
String String String String String String String Comparable -
Comparable Comparable Comparable Comparable Comparable Comparable Comparable Comparable -
Object - - - - - - - -

リテラル

条件で使用できるリテラルは nulltruefalse です。例:

  • request.header.host is null
  • flow.cachehit is true

    <RouteRule name="default">
         <Condition>request.header.content-type = "text/xml"</Condition>
         <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
    </RouteRule>
    
    <Step>
        <Condition>response.status.code = 503</Condition>
        <Name>MaintenancePolicy</Name>
    </Step>
    
    <Flow name="GetRequests">
        <Condition>response.verb="GET"</Condition>
        <Request>
            <Step>
                <Condition>request.path ~ "/statuses/**"</Condition>
                <Name>StatusesRequestPolicy</Name>
            </Step>
        </Request>
        <Response>
            <Step>
                <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
                <Name>MaintenancePolicy</Name>
            </Step>
        </Response>
    </Flow>