本页面适用于 Apigee 和 Apigee Hybrid。
查看 Apigee Edge 文档。
条件可让 API 代理在运行时动态运行。条件用于定义对 Apigee 处理流水线评估的变量的操作。条件语句是布尔值,其求值始终为 true
或 false
。
Conditions 概览
本部分介绍了利用 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>
流执行
您可以使用条件语句来控制 ProxyEndpoints
和 TargetEndpoints
中已命名的流的执行。请注意,只可有条件地执行“已命名”的流。ProxyEndpoints
和 TargetEndpoints
的预流程和后流程(请求和响应)都针对每个事务执行,因此可提供无条件的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>
目标端点路由选择
您可以使用条件语句来控制由代理端点配置调用的目标端点。路由规则会将请求转发到特定的目标端点。当多个目标端点可用时,路由规则会评估其条件,并且如果为 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 依赖
java.util.regex
中实现的正则表达式。
下表列出了支持的运算符。您可以在表达式中使用符号或单词:
符号 | Word | 说明 |
---|---|---|
! |
Not ,not |
一元运算符(使用单个输入) |
= |
Equals ,Is |
等于(区分大小写) |
!= |
NotEquals ,IsNot |
不等于(区分大小写) |
:= |
EqualsCaseInsensitive |
相等,但不区分大小写 |
> 或 > |
GreaterThan |
大于。 如果在 Apigee 界面中定义条件时使用 >,则该函数将转换为 >。 |
>= 或 >= |
GreaterThanOrEquals |
大于或等于。 如果在 Apigee 界面中定义条件时使用 >=,则该函数将转换为 >=。 |
< |
LesserThan |
小于。Apigee 界面不支持字面量 <. |
<= |
LesserThanOrEquals |
小于或等于。Apigee 界面不支持字面量 <=。 |
&& |
And ,and |
且 |
|| |
Or |
OR 运算符不区分大小写。例如,OR 、Or 和 or 都是有效值。 |
() |
对表达式进行分组。( 打开表达式,) 会将其关闭。 |
|
~~ |
JavaRegex |
与 |
~ |
Matches ,Like |
使用 * 通配符字符匹配 glob 样式的模式。该匹配区分大小写。如需查看示例,请参阅模式匹配。 |
~/ |
MatchesPath ,LikePath |
匹配路径表达式。该匹配区分大小写。 如需查看示例,请参阅模式匹配。 |
=| |
StartsWith |
匹配字符串的第一个字符。该匹配区分大小写。 |
操作对象
在进行比较之前,Apigee 会根据常见数据类型调整操作对象。例如,如果响应状态代码为 404
,表达式 response.status.code = "400"
和 response.status.code = 400
是等效的。
对于数字操作对象,数据类型会被解释为整数,除非该值按以下方式终止:
f
或F
(float
,例如3.142f, 91.1F
)d
或D
(double
,例如3.142d, 100.123D
)l
或L
(long
,例如12321421312L
)
在这些情况下,系统会执行下表中显示的适配(RHS 指的是等式的右侧,LHS 是左侧):
RHS LHS | 布尔值 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | 对象 |
---|---|---|---|---|---|---|---|---|
布尔值 | 布尔值 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | - | |
整数 | 整数 | 整数 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
长 | 长 | 长 | 长 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
浮点数 | 浮点数 | 浮点数 | 浮点数 | 浮点数 | 双精度型 | 字符串 | 可比较 | - |
双精度型 | 双精度型 | 双精度型 | 双精度型 | 双精度型 | 双精度型 | 字符串 | 可比较 | - |
字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 字符串 | 可比较 | - |
可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | 可比较 | - |
对象 | - | - | - | - | - | - | - | - |
Null 操作对象
下表显示了在所显示操作对象的左侧 (LHS) 和/或右侧 (RHS) 中,当值为 null 时的条件是求值为 true
还是 false
:
运算符 | LHS null | RHS null | LHS 和 RHS null |
---|---|---|---|
= 、== 、:= |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> 或 > |
true | false | false |
>= 或 >= |
false | true | true |
< |
true | false | false |
<= |
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>