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)}%”)|”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}%| |

原位内插