條件參考資料

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

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

條件總覽

本節說明搭配 Edge 使用條件陳述式的方式和位置。此外, 以下各節說明語法:

,瞭解如何調查及移除這項存取權。

條件陳述式的結構

條件陳述式的基本結構如下:

<Condition>variable.name operator "value"</Condition>

例如:

<Condition>request.verb = "GET"</Condition>

您可以使用「AND」結合條件,一次強制執行多個條件。舉例來說, 只有當要求 URI 與下列條件相符時,系統才會評估為 true /statuses「而且」該要求的 HTTP 動詞為 GET:

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

流程執行

使用條件陳述式,可控管 ProxyEndpoint 中具名流程的執行作業 以及 Target Endpoints請注意,只有「已命名」的也能有條件地執行流程準備和 ProxyEndpoint (要求與回應) 上的 Postflow (要求與回應),會針對每個端點執行 交易,因此提供無條件的「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 端點叫用的目標端點 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定轉送規則會將要求轉送至特定目標端點。有超過 有一個目標端點可用、轉送規則會根據該條件評估。如果為 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

下表列出支援的運算子。您可以在 運算式:

符號 Word 說明
! 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」(長字,例如 12321421312L)

在這類情況下,系統會將其調整如下表所示 (其中 RHS 是指 右側為 LHS 則位於左側):

左側右耳 布林值 整數 浮點值 雙人床 字串 類似 物件
布林值 布林值 整數 浮點值 雙人床 字串 -
整數 整數 整數 浮點值 雙人床 字串 類似 -
浮點值 雙人床 字串 類似 -
浮點值 浮點值 浮點值 浮點值 浮點值 雙人床 字串 類似 -
雙人床 雙人床 雙人床 雙人床 雙人床 雙人床 字串 類似 -
字串 字串 字串 字串 字串 字串 字串 類似 -
類似 類似 類似 類似 類似 類似 類似 類似 -
物件 - - - - - - - -

空值運算元

下表顯示條件會得出 true 還是 當左側 (LHS) 和/或右側 (RHS) 的值為空值時為 false 的運算元:

運算子 LHS 空值 RHS 為空值 LHS 和 RHS 為空值
===:= true
=|
!= true true
>&gt; true
>=&gt;= true true
&lt; true
&lt;= true true
~ 不適用
~~ 不適用
!~ true
~/ 不適用

常值

除了字串和數字常值外,您也可以在 條件陳述式:

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