このページの内容は Apigee と Apigee ハイブリッドに該当します。
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>
フローの実行
条件文を使用すると、 ProxyEndpoints
と TargetEndpoints
で名前付きフローの実行を制御できます。条件付きで実行できるのは名前付きのフローだけです。すべてのトランザクションで ProxyEndpoints
と TargetEndpoints
のプリフローとポストフロー(リクエストとレスポンスの両方)が実行されるため、無条件のフェイルセーフ機能が提供されます。
たとえば、リクエスト メッセージの 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
とは一致しません。
変数
条件文では、組み込みフロー変数とカスタム変数の両方を使用できます。詳しくは以下をご覧ください。
- フロー変数のリファレンス: 組み込み変数の完全なリスト
- ExtractVariables ポリシー: カスタム変数の設定手順
演算子
演算子を使用する場合は、次の制限事項に注意してください。
- 演算子を変数名として使用することはできません。
- 演算子の前後にはスペース文字が 1 個必要です。
- 変数内で演算子を使用する場合は、変数名を一重引用符で囲む必要があります。例:
'request.header.help!me'
- 算術演算子(
+ * - / %
)はサポートされていません。 - 演算子には、Java 優先順位が使用されます。
- Apigee は、
java.util.regex
で実装されている正規表現に依存しています。
次の表に、サポートされている演算子を示します。記号または単語を式の中で使用できます。
記号 | 単語 | 説明 |
---|---|---|
! |
Not 、not |
単項演算子(1 個の入力が必要) |
= |
Equals 、Is |
等しい(大文字と小文字を区別) |
!= |
NotEquals 、IsNot |
等しくない(大文字と小文字を区別) |
:= |
EqualsCaseInsensitive |
等しい(大文字と小文字を区別しない) |
> または > |
GreaterThan |
より大きい。Apigee UI で条件を定義するときに > を使用すると、> に変換されます。 |
>= または >= |
GreaterThanOrEquals |
以上。Apigee UI で条件を定義するときに >= を使用すると、>= に変換されます。 |
< |
LesserThan |
未満。Apigee UI は、リテラルの「<」をサポートしていません。 |
<= |
LesserThanOrEquals |
以下。Apigee UI は、リテラルの「<=」をサポートしていません。 |
&& |
And 、and |
および |
|| |
Or |
Or 演算子では大文字と小文字が区別されません。たとえば、OR 、Or 、or はすべて有効です。 |
() |
式のグループ化。( は式を開く記号、) は式を閉じる記号です。 |
|
~~ |
JavaRegex |
|
~ |
Matches 、Like |
* ワイルドカード文字を使用して、glob スタイルのパターンと照合します。大文字と小文字が区別されます。例については、パターン マッチングをご覧ください。 |
~/ |
MatchesPath 、LikePath |
パス式を照合します。大文字と小文字が区別されます。例については、パターン マッチングをご覧ください。 |
=| |
StartsWith |
文字列の先頭文字と照合します。大文字と小文字が区別されます。 |
オペランド
比較を行う前に、Apigee はオペランドを共通のデータ型に適合させます。たとえば、レスポンスのステータス コードが 404
の場合、式 response.status.code = "400"
と response.status.code = 400
は同等です。
数値オペランドの場合、値の最後が次の場合を除き、データ型は整数として解釈されます。
f
またはF
(float
、たとえば3.142f, 91.1F
)d
またはD
(double
、たとえば3.142d, 100.123D
)l
またはL
(long
、たとえば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 |
> または > |
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>