條件參考資料

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

條件可讓 API Proxy 在執行階段動態執行。條件會定義變數的運算,並由 Apigee 處理管道進行評估。條件陳述式為布林值,且一律會評估為 truefalse

條件總覽

本節說明如何在 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 上的前置流和後置流 (包括要求和回應) 會針對每筆交易執行,因此可提供無條件的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 層級。大括號 {name} 也可用來比對單一路徑元素,讓讀者更清楚瞭解路徑。變數 name 僅用於提供清楚說明,不會在流程變數中填入比對相符的值。

例如:

模式 相符的 URI 路徑範例
/*/a/ /x/a//y/a/
/*/a/* /x/a/b/y/a/foo
/*/a/** /x/a/b/c/d
/*/a/{reader}/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 會依賴 java.util.regex 中實作的規則運算式。

下表列出支援的運算子。您可以在運算式中使用符號或字詞:

符號 Word 說明
! Notnot 一元運算子 (接受單一輸入)
= 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 是等同的。

對於數值運算元,除非值以下列方式結尾,否則系統會將資料類型解讀為整數:

  • fF (float,例如 3.142f, 91.1F)
  • dD (double,例如 3.142d, 100.123D)
  • lL (long,例如 12321421312L)

在這些情況下,系統會執行下表所示的調整作業 (其中 RHS 是指等式的右側,LHS 是指左側):

RHS LHS 布林值 整數 浮點值 雙精度值 字串 可比較 物件
布林值 布林值 整數 浮點值 雙精度值 字串 -
整數 整數 整數 浮點值 雙精度值 字串 可比較 -
浮點值 雙精度值 字串 可比較 -
浮點值 浮點值 浮點值 浮點值 浮點值 雙精度值 字串 可比較 -
雙精度值 雙精度值 雙精度值 雙精度值 雙精度值 雙精度值 字串 可比較 -
字串 字串 字串 字串 字串 字串 字串 可比較 -
可比較 可比較 可比較 可比較 可比較 可比較 可比較 可比較 -
物件 - - - - - - - -

空運算元

下表顯示,當運算元的左側 (LHS) 和/或右側 (RHS) 的值為空值時,條件會評估為 truefalse

運算子 左手邊為空值 RHS 空值 LHS 和 RHS 為空值
===:= 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>