样书配置

原位内插

现在可以使用样书表达式替换字符串的部分。当样书编译器对这些字符串表达式进行计算时,使用样书表达式的字符串部分将被表达式的值替换。要在字符串中包含样书表达式,我们使用以下表示法:

"...%{...}%..."
<!--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-portipaddress 和字符串。内插替换为结果时,生成的值会自动转换为字符串。

字符串表达式可以有 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)}%")
str("%{quotewrap(https://)}%+HTTP.REQ.HOSTNAME+HTTP.REQ.URL")
"abcd
<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}%|

原位内插