條件參考資料

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

設定條件可讓 API Proxy 在執行階段動態行為。條件可用來定義變數的作業,這些變數會由 Apigee Edge 處理管道評估。條件陳述式屬於布林值,且一律會評估為 truefalse

條件總覽

本節說明如何搭配 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 中實作的規則運算式。

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

符號 字詞 說明
! Notnot 一元運算子 (採用單一輸入)
= EqualsIs 等於 (區分大小寫)
!= NotEqualsIsNot 不等於 (區分大小寫)
:= EqualsCaseInsensitive 等於,但不區分大小寫
>&gt; GreaterThan 大於。如果您在 Edge UI 中定義條件時使用 >,系統就會將該條件轉換為 &gt;。
>=&gt;= GreaterThanOrEquals 大於或等於。如果您在 Edge UI 中定義條件時使用 >=,系統就會將該條件轉換為 &gt;=。
&lt; LesserThan 小於。Edge UI 不支援常值「<」。
&lt;= LesserThanOrEquals 小於或等於。Edge UI 不支援 <= 常值。
&& Andand
|| Or Or 運算子不區分大小寫。舉例來說,OROror 都是有效的值。
() 將運算式分組。( 會開啟運算式,) 會關閉該運算式。
~~ JavaRegex

比對符合 javax.util.regex 的規則運算式。比對會區分大小寫。如需範例,請參閱「條件陳述式中的模式比對」。

~ MatchesLike 使用「*」萬用字元比對 glob 樣式模式。比對會區分大小寫。如需範例,請參閱「使用條件式的模式比對」。
~/ MatchesPathLikePath 符合路徑運算式。比對會區分大小寫。如需範例,請參閱「使用條件式的模式比對」。
=| 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) 值為空值時,條件是評估為 truefalse

運作資源 LHS 空值 RHS 空值 LHS 和 RHS 空值
===:= false false
=| false false false
!= false
>&gt; false false
>=&gt;= false
&lt; false false
&lt;= 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>