Application Delivery Management

原位内插

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

              “…%{…}%…”

其中,“%{”和“}%”之间包括的字符构成样本表达式。这些表达式称为“原位内插”。

例如,字符串“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}%
     
原位内插