<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
条件可让 API 代理在运行时动态运行。条件定义操作
这些变量由 Apigee Edge 处理流水线进行评估。条件语句是布尔值,其求值始终为 true
或 false
。
Conditions 概览
本部分介绍如何和在何处使用条件语句与 Edge。此外,以下部分还介绍了语法:
条件语句的结构
条件语句的基本结构如下:
<Condition>variable.name operator "value"</Condition>
例如:
<Condition>request.verb = "GET"</Condition>
您可以使用 AND 组合多个条件,以便同时执行多个条件。例如,以下条件评估为 true
仅在请求的 URI 与 /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>
流执行
您可以使用条件语句来控制 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 政策:设置自定义变量的说明
运算符
使用运算符时,请注意以下限制:
- 运算符不能用作变量名称。
- 运算符前后必须添加空格字符。
- 要在变量中包含运算符,变量名称必须括在单引号中。例如
'request.header.help!me'
。 - 算术运算符 (
+ * - / %
) 不受支持。 - 对于运算符,使用 Java 优先级。
- Apigee Edge 依赖于
java.util.regex
。
下表列出了支持的运算符。您可以在表达式中使用符号或单词:
符号 | Word | 说明 |
---|---|---|
! |
Not ,not |
一元运算符(使用单个输入) |
= |
Equals ,Is |
等于(区分大小写) |
!= |
NotEquals ,IsNot |
不等于(区分大小写) |
:= |
EqualsCaseInsensitive |
相等,但不区分大小写 |
> 或 > |
GreaterThan |
大于。 如果您使用 >在 Edge 界面中定义条件时, 已转换为 >。 |
>= 或 >= |
GreaterThanOrEquals |
大于或等于。 如果在 Edge 界面中定义条件时使用 >=, 它会被转换为 >=。 |
< |
LesserThan |
小于。Edge 界面不支持字面量 <。 |
<= |
LesserThanOrEquals |
小于或等于。Edge 界面不支持字面量 <=。 |
&& |
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”(长,例如,12321421312L)
在这些情况下,系统会执行下表中显示的适配(RHS 指的是等式的右侧,LHS 是左侧):
RHS LHS | 布尔值 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | 对象 |
---|---|---|---|---|---|---|---|---|
布尔值 | 布尔值 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | - | |
整数 | 整数 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
长 | 长 | 长 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
浮点数 | 浮点数 | 浮点数 | 浮点数 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
双精度型 | 双精度型 | 双精度型 | 双精度型 | 双精度型 | 双精度型 | 字符串 | 可比较 | - |
字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 可比较 | - |
可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | - |
对象 | - | - | - | - | - | - | - | - |
Null 操作对象
下表显示了在所显示操作对象的左侧 (LHS) 和/或右侧 (RHS) 中,当值为 null 时的条件是求值为 true
还是 false
:
运算符 | LHS null | RHS null | LHS 和 RHS null |
---|---|---|---|
= 、== 、:= |
否 | 否 | 是 |
=| |
否 | 否 | 否 |
!= |
是 | 是 | 否 |
> 或 > |
是 | 否 | 否 |
>= 或 >= |
否 | 是 | 是 |
< |
是 | 否 | 否 |
<= |
是 | 否 | 是 |
~ |
否 | 不适用 | 否 |
~~ |
否 | 不适用 | 否 |
!~ |
是 | 否 | 否 |
~/ |
否 | 不适用 | 否 |
字面量
除了字符串和数值字面之外,您还可以在条件语句中使用以下字面:
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>