就地插值
现在可以使用 StyleBook 表达式替换字符串的一部分。当 StyleBook 编译器评估这些字符串表达式时,字符串中使用 StyleBook 表达式的部分将被表达式的值替换。要在字符串中包含 StyleBook 表达式,我们使用以下表示法:
"...%{...}%..."
其中,括在“ %{ ”和“}%”之间的字符构成一个 StyleBook 表达式。这些表达式被称为“就地插值”。
例如,字符串
lb-%{$parameters.appname}%-svc 是一个包含 StyleBook 表达式就地插值的字符串表达式。字符串表达式的值取决于插值表达式的值。假设 $parameters.appname 被赋值为“app1”。那么,该字符串表达式的计算结果为 lb-app1-svc。这使得值不必硬编码在字符串表达式中,而是根据用户定义的值进行评估。
就地插值的一个实际用例是在 StyleBook 中参数化策略表达式。考虑这样一个场景:您想编写一个策略表达式,检查 HTTP URL 是否包含特定单词,例如“jpeg”。
为此,您可以编写如下策略表达式:“HTTP.REQ.URL.CONTAINS(\\"jpeg\\")”。
现在,如果您想参数化 HTTP URL 中的对象,您可以在 StyleBook 中添加一个字符串参数,例如
$parameters.url-object。策略表达式是基于此参数编写的。为此,您可以使用字符串连接来实现结果。表达式将如下所示:
str("HTTP.REQ.URL.CONTAINS(\\"" + $parameters.url-object + "\\")")
如果
$parameter.url-object 被赋值为“csv”,上述表达式的计算结果为“HTTP.REQ.URL.CONTAINS(\\"csv\\")”。然而,这个表达式不易阅读。为了使这种参数化易于阅读和理解,您可以使用就地插值。
包含就地插值的表达式现在是:
str("HTTP.REQ.URL.CONTAINS(%{quotewrap($parameters.url-object)}%)")
在上述表达式中,您使用了一个插值表达式,它在 $parameters.url-object 的值周围添加了内部引号。这个表达式的结果与上述相同,但是,它看起来更直观,更接近实际结果。
插值中允许的类型
您可以在插值内部使用生成以下类型值的表达式:布尔值、数字、
tcp-port、ipaddress 和字符串。当插值被结果替换时,生成的值会自动转换为字符串。
字符串表达式可以包含 0 个、1 个或多个插值。在顺序插值中,字符串表达式的不同部分可以被不同的 StyleBook 表达式替换。例如,如果 $parameters.appname 为“app1”且 $parameters.vip 为“1.1.1.1”,则字符串 lb-%{$parameters.appname}%-%{$parameters.vip}% 返回“lb-app1-1.1.1.1”。
字符串表达式还支持嵌套插值。也就是说,一个插值表达式可以嵌套在另一个插值表达式中,这样,一个表达式的值就可以成为第二个表达式的输入。
例如,考虑一个字符串“%{lb-%{$parameters.port + 1}%}%”
内部字符串“%{$parameters.port + 1}%”在 $parameters.port 为 80 时返回“lb-81”。这里,此表达式嵌套在另一个插值表达式中。
下表描述了不同类型的插值,并提供了示例和相应的结果。示例中使用的参数值为:
-
$parameters.appname: "lb1"
-
$parameters.vip: "1.1.1.1"
-
$parameters.n1: 1
-
$parameters.n2: 3
简单插值
| 表达式 | 结果 |
|---|---|
lb-%{$parameters.appname}%-def |
lb-lb1-def |
自动类型转换
| 表达式 | 结果 |
|---|---|
| lb-%{1}% | lb-1 |
| lb-%{$parameters.vip}% | lb-1.1.1.1 |
| 负载均衡器-%{true}% | 负载均衡器-True |
顺序插值
| 表达式 | 结果 |
|---|---|
| %{$parameters.appname}%-%{str($parameters.appname)}% | 负载均衡器1-负载均衡器1 |
| lb-%{1}%-%{2}% | lb-1-2 |
嵌套插值
| 表达式 | 结果 |
|---|---|
%{abc-%{$parameters.n1 + 1}%}% |
abc-2 |
str("%{abc-%{$parameters.n1}%}%-%{$parameters.n2}%") |
bc-1-3 |
使用 quotewrap 进行插值
| 表达式 | 结果 |
|---|---|
str("%{quotewrap(abcd)}%") |
\"abcd |
str("%{quotewrap(https://)}%+HTTP.REQ.HOSTNAME+HTTP.REQ.URL") |
<https://"+HTTP.REQ.HOST NAME+HTTP.REQ.URL |
插值中的转义字符
如果字符“% {”或“}%”是字符串的一部分,您必须提供“
\”作为转义字符,以便 StyleBook 编译器不会将它们评估为插值标签。
示例:
str("%{\%\{ + str($parameters.vip) + \}\%}%") returns "%{1.1.1.1}%" if $parameters.vip is 1.1.1.1
下表描述了更多表达式及其结果:
| 类别 | 表达式 | 结果 |
|---|---|---|
| 转义插值 | str("%{str($parameters.n1) + \}\%}%") |
1}% |
lb-%{str($parameters.n1) + \}\%}% |
lb-1}% |
|
"%{str($parameters.n1) + \\"\\}\\%\\"}%"\|1}% |