条件を使用すると、ランタイムに API プロキシの動作を動的に制御できます。条件では変数に対するオペレーションを定義します。この条件は、Apigee Edge 処理パイプラインで評価されます。条件文はブール値です。常に true または false と評価されます。
条件の概要
このセクションでは、Edge で条件文を使用する方法と場所について説明します。さらに、次のセクションで構文について説明します。
条件文の構造
条件文の基本的な構造は次のとおりです。
<Condition>variable.name operator "value"</Condition>
例:
<Condition>request.verb = "GET"</Condition>
条件を AND で組み合わせれば、一度に複数の条件を適用できます。たとえば、次の条件は、リクエストの URI が /statuses と一致し、リクエストの HTTP 動詞が GET である場合にのみ、true と評価されます。
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
条件文の使用場所
条件を使用することにより、以下の動作を制御できます。
ポリシーの実行
条件文を使用すると、ポリシーの適用を制御できます。よく使われる例としては、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 とは一致しません。
変数
条件文では、組み込みフロー変数とカスタム変数の両方を使用できます。詳細については、次をご覧ください。
- フロー変数のリファレンス: 組み込み変数の完全なリスト
- ExtractVariables ポリシー: カスタム変数の設定手順
演算子
演算子を使用する場合は、次の制限事項に注意してください。
- 演算子を変数名として使用できません。
- 演算子の前後にはスペース文字が 1 個必要です。
- 変数内で演算子を使用する場合は、変数名を一重引用符で囲む必要があります。例: 'request.header.help!me'
- 算術演算子(+ * - / %)はサポートされていません。
- 演算子には、Java の優先順位が使用されます。
- Apigee Edge は、java.util.regexで実装されている正規表現に依存しています。
次の表に、サポートされている演算子を示します。記号または単語を式の中で使用できます。
| 記号 | 単語 | 説明 | 
|---|---|---|
| ! | Not、not | 単項演算子(1 個の入力が必要) | 
| = | Equals、Is | 等しい(大文字と小文字を区別) | 
| != | NotEquals、IsNot | 等しくない(大文字と小文字を区別) | 
| := | EqualsCaseInsensitive | 等しい(大文字と小文字を区別しない) | 
| >または> | GreaterThan | より大きい。Edge UI で条件を定義する際に「>」を使用すると、> に変換されます。 | 
| >=または>= | GreaterThanOrEquals | 以上。Edge UI で条件を定義するときに「>=」を使用すると、&gt;= に変換されます。 | 
| < | LesserThan | 未満。Edge UI は、リテラルの「<」をサポートしていません。 | 
| <= | LesserThanOrEquals | 以下。Edge UI は、リテラルの「=」をサポートしていません。 | 
| && | And、and | および | 
| || | Or | または | 
| () | 式のグループ化。 (は式を開く記号、)は式を閉じる記号です。 | |
| ~~ | JavaRegex | 
 | 
| ~ | Matches、Like | glob スタイルのパターンと照合します。"*" ワイルドカード文字を使用します。大文字と小文字が区別されます。例については、条件を使用したパターン マッチングをご覧ください。 | 
| ~/ | MatchesPath、LikePath | パス式と照合します。大文字と小文字が区別されます。例については、条件を使用したパターン マッチングをご覧ください。 | 
| =| | StartsWith | 文字列の先頭文字を照合します。大文字と小文字が区別されます。 | 
オペランド
比較を行う前に、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)
このような場合、システムは次の表に示す適応を実行します(右辺は計算式の右辺、左辺は計算式の左辺)。
| 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 | - | - | - | - | - | - | - | - | 
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 | 
リテラル
条件文では、文字列リテラルと数値リテラルに加えて、次のリテラルを使用できます。
- null
- true
- false
例:
- 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>