条件のリファレンス

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントを表示する。

条件を使用すると、ランタイムに API プロキシの動作を動的に制御できます。条件では変数の操作が定義されます。この条件は、Apigee 処理パイプラインで評価されます。条件文はブール値です。常に true または false と評価されます。

条件の概要

このセクションでは、Apigee で条件文を使用する方法と場所について説明します。さらに、次のセクションで構文について説明します。

条件文の構造

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

<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>

フローの実行

条件文を使用すると、 ProxyEndpointsTargetEndpoints で名前付きフローの実行を制御できます。条件付きで実行できるのは名前付きのフローだけです。すべてのトランザクションで ProxyEndpointsTargetEndpoints のプリフローとポストフロー(リクエストとレスポンスの両方)が実行されるため、無条件のフェイルセーフ機能が提供されます。

たとえば、リクエスト メッセージの 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 パスの照合に使用されます。* を使用して単一のパス要素を表し、** を使用して複数の 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 は、java.util.regex で実装されている正規表現に依存しています。

次の表に、サポートされている演算子を示します。記号または単語を式の中で使用できます。

記号 単語 説明
! Notnot 単項演算子(1 個の入力が必要)
= EqualsIs 等しい(大文字と小文字を区別)
!= NotEqualsIsNot 等しくない(大文字と小文字を区別)
:= EqualsCaseInsensitive 等しい(大文字と小文字を区別しない)
> または &gt; GreaterThan より大きい。Apigee UI で条件を定義するときに > を使用すると、&gt; に変換されます。
>= または &gt;= GreaterThanOrEquals 以上。Apigee UI で条件を定義するときに >= を使用すると、&gt;= に変換されます。
&lt; LesserThan 未満。Apigee UI は、リテラルの「<」をサポートしていません。
&lt;= LesserThanOrEquals 以下。Apigee UI は、リテラルの「<=」をサポートしていません。
&& Andand および
|| Or Or 演算子では大文字と小文字が区別されません。たとえば、OROror はすべて有効です。
() 式のグループ化。( は式を開く記号、) は式を閉じる記号です。
~~ JavaRegex

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

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

オペランド

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

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

  • f または Ffloat、たとえば 3.142f, 91.1F
  • d または Ddouble、たとえば 3.142d, 100.123D
  • l または Llong、たとえば 12321421312L

このような場合、次の表に示す適応が行われます(RHS は式の右側、LHS は式の左側を指します)。

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
> または &gt; true false false
>= または &gt;= false true true
&lt; true false false
&lt;= 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>