原位内插
现在可以使用样书表达式替换字符串的部分。当 StyleBook 编译器对这些字符串表达式进行计算时,使用样书表达式的字符串部分将被表达式的值替换。要在字符串中包含样本表达式,我们使用以下表示法:
"...%{...}%..."
<!--NeedCopy-->
其中包含在 “% {” 和 “}%” 之间的字符构成样书表达式。这些表达式称为“原位内插”。
例如,字符串 lb-%{$parameters.appname}%-svc
是具有样书表达式的就地插值的字符串表达式。字符串表达式的值取决于插值表达式的值。假定为 $parameters.appname 分配了 app1。然后,字符串表达式计算为 lb-app1-svc。这就允许不在字符串表达式中对值进行硬编码,而是根据用户定义的值求值。
原位内插的一个实际用例是在样本中参数化策略表达式。假设这样一个场景: 您要编写一个策略表达式,用于检查 HTTP URL 是否包含特定的单词,例如 “jpeg”。
为此,您可以编写如下所示的策略表达式:”HTTP.REQ.URL.CONTAINS(\“jpeg\”)”。
现在,如果你想参数化 HTTP URL 中的对象,你可以在样书中添加一个字符串参数,比如说 $parameters.url-object
。策略表达式是基于此参数编写的。为此,应使用字符串连接来达到效果。该表达式类似如下:
str("HTTP.REQ.URL.CONTAINS(\\"" + $parameters.url-object + "\\")")
<!--NeedCopy-->
如果 $parameter.url-object
分配了 “csv”,则上述表达式的计算结果为 “HTTP.REQ.URL.CONTAY (\” csv\”)”。但是,此表达式不易阅读。为了使此参数化形式易于阅读和理解,可以使用原位内插。
现在,包含原位内插的表达式为:
str("HTTP.REQ.URL.CONTAINS(%{quotewrap($parameters.url-object)}%)")
<!--NeedCopy-->
在上述表达式中,使用了一个在 $parameters.url-object 值两边添加内部引号的内插表达式。此表达式的结果与上述结果相同,但是,它看起来更直观,更接近实际结果。
内插中允许的类型
您可以使用在插值中生成以下类型值的表达式:布尔值、数字、tcp-port
、ipaddress
和字符串。内插替换为结果时,生成的值会自动转换为字符串。
字符串表达式可以有 0、1 个或更多内插。在顺序内插中,字符串表达式的不同部分可以替换为不同的样本表达式。例如,如果 $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 为 80,内部字符串 %{$parameters.port + 1}% 将返回 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 |
lb-%{true}% | lb-True |
顺序内插
表达式 | 结果 |
---|---|
%{$parameters.appname}%-%{str($parameters.appname)}% | lb1-lb1 |
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 |
内插中的转义字符
如果字符“%{”或“}%”是字符串的一部分,您必须提供“\
”作为转义字符以便样书编译器不会将它们视为内插标记。
示例:
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}%
|