NSX Advanced Load Balancer 包括用于在 DataScript 中解析 XML 负载的 XML 解析程序。通过使用此功能,您可以深入了解 XML 负载,或者根据 XML 正文中的参数执行某些操作。
NSX Advanced Load Balancer 添加了用于处理 XML 的 XML 解析程序。XML 解析程序需要包装程序。为此,在 DataScript 的开头使用 NSX Advanced Load Balancer XML 解析程序:
local avixmlparser = require("avixmlparser") success, document = avixmlparser.parse(body) success, contents = avixmlparser.search(document, xpath)
avixmlparser 具有两个函数:
解析
搜索
函数 |
参数 |
返回 |
---|---|---|
解析 |
请求正文 |
返回两个值:
|
搜索 |
|
返回两个值:
|
用例
用例 1 - Horizon - 负载均衡 UAG 服务器:
XML 是 Horizon 的控制协议。负载中的信息(如用户名、客户端类型等)可用于执行任何自定义操作(Horizon Client:Windows/MAC)。
注:如果要对 Horizon 相关用例使用 DataScript,请确保已为 /ice URL 禁用请求正文缓冲,如果未禁用,将不会建立隧道连接。
要通过 DataScript 选择性地禁用正文缓冲,请在“请求”事件下添加以下内容。
HTTP_REQ event: local function starts_with(str, start) return str:sub(1, #start) == start end if starts_with(avi.http.get_uri(), "/ice/tunnel") then avi.http.set_request_body_buffer_size(0) end
用例 2 - 最常见的示例是在 NSX Advanced Load Balancer 应用程序日志中打印用户名。
用于从 XML API 请求中提取用户名的 DataScript 如下所示:
local avixmlparser = require("avixmlparser") local body = avi.http.get_req_body(2048) local xpath = "/broker/do-submit-authentication/screen[name='windows-password']/params/param[name='username']/values/value" local succ_parse, document = avixmlparser.parse(body) if succ_parse then local succ_search, contents = avixmlparser.search(document, xpath) if succ_search then for i, v in ipairs(contents) do if v ~= nil then avi.http.set_userid(v) end end else avi.vs.log(contents) end else avi.vs.log(document) end
在此示例中,我们首先获取请求正文并对其进行解析。如果解析成功,我们将使用 xpath 搜索正文,如果搜索成功,我们将获取搜索结果。如果搜索失败,则可能会记录错误信息。
日志如下所示:
用例 3 - 添加包含某些 MAC 地址的字符串组。编写引用该字符串组的 DataScript。
只有提供了 MAC 地址的用户才必须进行身份验证。必须关闭其他连接。
参阅上面的示例 XML,MAC 地址的 xpath 为
local xpath = “/broker/do-submit-authentication/environment-information/info[@name=‘MAC_Address’]”
用例 4 - 多因素身份验证
解析 securid-password 以进行多因素身份验证时,将使用以下 DataScript 在虚拟服务日志上打印用户名或用户 ID
local avixmlparser = require("avixmlparser") local body = avi.http.get_req_body(2048) local xpath = "/broker/do-submit-authentication/screen[name='securid-passcode']/params/param[name='username']/values/value" local succ_parse, document = avixmlparser.parse(body) if succ_parse then local succ_search, contents = avixmlparser.search(document, xpath) if succ_search then for i, v in ipairs(contents) do if v ~= nil then avi.http.set_userid(v) end end end end