这篇文章已经过机器翻译.放弃
原位内插
现在可以替换字符串中使用样书表达式的部分。样本编译器对这些字符串表达式进行求值时,字符串中使用样本表达式的部分将替换为表达式的值。要在字符串中包括样书表达式,我们使用以下表示法:
“…%{…}%…”
其中,“%{”和“}%”之间包括的字符构成样本表达式。这些表达式称为“原位内插”。
例如,字符串“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 + “\”)”)
如果为 $parameter.url-object 分配 “csv”,则上述表达式的求值结果将为 “HTTP.REQ.URL.CONTAINS(\“csv\”)”。但是,此表达式不易阅读。为了使此参数化形式易于阅读和理解,可以使用原位内插。
现在,包含原位内插的表达式为:
str(“HTTP.REQ.URL.CONTAINS(%{quotewrap($parameters.url-object)}%)”)
在上述表达式中,使用了一个在 $parameters.url-object 值两边添加内部引号的内插表达式。此表达式的结果与上述表达式相同,但它更加直观且更接近实际结果。
内插中允许的类型
您可以在内插中使用生成以下类型值的表达式:boolean、number、tcp-port、ipaddress 和 string。内插替换为结果时,生成的值会自动转换为字符串。
字符串表达式可以有 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
“«code class=”language-plaintext highlighter-rouge”>https://”+HTTP.REQ.HOST NAME+HTTP.REQ.URL</code> |
内插中的转义字符
如果字符“% {”或“}%”是字符串的一部分,则必须提供“\
”作为转义字符,这样样书编译器就不会将它们视为插值标签。
示例:
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}% | |