您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
設定條件可讓 API Proxy 在執行階段動態行為。條件可用來定義變數的作業,這些變數會由 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>
流程執行
您可以透過條件陳述式,控管 Proxy Endpoints 和目標端點中的具名流程執行。請注意,只有「已命名」的流程可以有條件執行。Proxy Endpoints 和 Target Endpoints 上的預先流程和後續作業 (包括要求和回應) 會為每個交易執行,因此提供無條件的「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>
選取目標端點路徑
使用條件陳述式時,您可以控管由 Proxy 端點設定叫用的目標端點。轉送規則會將要求轉送至特定的目標端點。有多個目標端點時,系統會評估轉送規則的條件,如果為 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
。
變數
您可以在條件陳述式中使用內建流程變數和自訂變數。詳情請參閱:
運算子
使用運算子時,請留意下列限制:
- 運算子無法做為變數名稱。
- 運算子的前後需要空格字元。
- 如要在變數中加入運算子,變數名稱必須以單引號括住。
例如
'request.header.help!me'
。 - 不支援算術運算子 (
+ * - / %
)。 - 運算子使用 Java 優先順序。
- Apigee Edge 仰賴
java.util.regex
中實作的規則運算式。
下表列出支援的運算子。您可以在運算式中使用符號或字詞:
符號 | 字詞 | 說明 |
---|---|---|
! |
Not 、not |
一元運算子 (採用單一輸入) |
= |
Equals 、Is |
等於 (區分大小寫) |
!= |
NotEquals 、IsNot |
不等於 (區分大小寫) |
:= |
EqualsCaseInsensitive |
等於,但不區分大小寫 |
> 或 > |
GreaterThan |
大於。如果您在 Edge UI 中定義條件時使用 >,系統就會將該條件轉換為 >。 |
>= 或 >= |
GreaterThanOrEquals |
大於或等於。如果您在 Edge UI 中定義條件時使用 >=,系統就會將該條件轉換為 >=。 |
< |
LesserThan |
小於。Edge UI 不支援常值「<」。 |
<= |
LesserThanOrEquals |
小於或等於。Edge UI 不支援 <= 常值。 |
&& |
And 、and |
和 |
|| |
Or |
Or 運算子不區分大小寫。舉例來說,OR 、Or 和 or 都是有效的值。 |
() |
將運算式分組。( 會開啟運算式,) 會關閉該運算式。 |
|
~~ |
JavaRegex |
比對符合 |
~ |
Matches 、Like |
使用「*」萬用字元比對 glob 樣式模式。比對會區分大小寫。如需範例,請參閱「使用條件式的模式比對」。 |
~/ |
MatchesPath 、LikePath |
符合路徑運算式。比對會區分大小寫。如需範例,請參閱「使用條件式的模式比對」。 |
=| |
StartsWith |
比對字串的第一個字元。比對會區分大小寫。 |
運算元
Apigee Edge 會先將運算元調整為通用資料類型,再進行比較。舉例來說,如果回應狀態碼為 404,運算式 response.status.code = "400"
和 response.status.code = 400
就等同。
如果是數字運算元,除非值終止,如下所示:
- 「f」或「F」(浮點值,例如 3.142f, 91.1F)
- 「d」或「D」(雙倍,例如 3.142d、100.123D)
- 「l」或「L」(long 例如 12321421312L)
在這類情況下,系統會執行下表中的調整 (RHS 是指等式的右側,而 LHS 位於左側):
右側右側畫面 | 布林值 | 整數 | 長整數 | 浮點值 | 二壘安打 | 字串 | 類似 | 物件 |
---|---|---|---|---|---|---|---|---|
布林值 | 布林值 | 整數 | 長整數 | 浮點值 | 二壘安打 | 字串 | - | |
整數 | 整數 | 整數 | 長整數 | 浮點值 | 二壘安打 | 字串 | 類似 | - |
長整數 | 長整數 | 長整數 | 長整數 | 浮點值 | 二壘安打 | 字串 | 類似 | - |
浮點值 | 浮點值 | 浮點值 | 浮點值 | 浮點值 | 二壘安打 | 字串 | 類似 | - |
二壘安打 | 二壘安打 | 二壘安打 | 二壘安打 | 二壘安打 | 二壘安打 | 字串 | 類似 | - |
字串 | 字串 | 字串 | 字串 | 字串 | 字串 | 字串 | 類似 | - |
類似 | 類似 | 類似 | 類似 | 類似 | 類似 | 類似 | 類似 | - |
物件 | - | - | - | - | - | - | - | - |
空值運算元
下表顯示當顯示的運算元左側 (LHS) 和/或右側 (RHS) 值為空值時,條件是評估為 true
或 false
:
運作資源 | LHS 空值 | RHS 空值 | LHS 和 RHS 空值 |
---|---|---|---|
= 、== 、:= |
false | false | 是 |
=| |
false | false | false |
!= |
是 | 是 | false |
> 或 > |
是 | false | false |
>= 或 >= |
false | 是 | 是 |
< |
是 | false | false |
<= |
是 | false | 是 |
~ |
false | 無 | false |
~~ |
false | 無 | false |
!~ |
是 | 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>