如何使用 Postman 从 XML 中提取变量?
Posted
技术标签:
【中文标题】如何使用 Postman 从 XML 中提取变量?【英文标题】:How do I extract a variable from XML using Postman? 【发布时间】:2016-08-17 08:36:59 【问题描述】:我正在尝试从 SOAP API 返回的 XML 中提取 SessionId。
我已经通读了 Postman 文档(几遍),但它对实现我的目标并不是最有帮助的。
一些博客中的建议是将 XML 转换为 JSON,然后从中挑选出令牌及其值,但这也无济于事。
我在测试中使用了以下内容:
var jsonObject = xml2Json(responseBody);
postman.setGlobalVariable("Session_Id", jsonObject.SessionID);
上面创建了变量“Session_Id”,但实际上并没有给它赋值。我难住了。
我肯定是从 API 中检索数据,并且可以在 Postman 的“Body”响应中查看。
【问题讨论】:
我仍在寻找这个问题的答案,我正在与向我介绍该应用程序的人证实。如果我在接下来的几天内不来,我会向 Postman 发送电子邮件。 jsonObject 的输出是什么,jsonObject.SessionID 是一个字符串。根据邮递员文档: postman.setGlobalVariable(variableName, variableValue):设置全局变量“variableName”,并将字符串“variableValue”分配给它。注意:只能存储字符串。存储其他类型的数据会导致意外行为。 我给 Postman @Shaugn 发了电子邮件,他们的一位创始人回复了我同样的建议。但他接着说,该应用程序会自动将任何其他类型转换为字符串。无论如何,我发现了这个问题。我没有深入研究 JSON blob。我最终使用了:'postman.setEnvironmentVariable("Session_Id", jsonObject.UserSessionToken.SessionId);'我使用了 Console.log 并不断检查输出,直到找到我需要的内容。 【参考方案1】:要使用 Postman 从 XML 中提取变量,首先使用 xml2Json 转换器方法将您的 XML 转换为 JSON:
var responseJson = xml2Json(responseBody);
(其中“responseBody”是您的 xml 正文。) 然后使用console.log方法输出你的JSON数据,如下:
console.log(responseJson);
请务必在Enabling Chrome Dev Tools in Postman上关注本教程
在您的测试运行器中,运行测试,然后右键单击并“检查”运行器中的任意位置。 Chrome 的开发工具启动后,选择“控制台”选项卡。展开“对象”部分。
然后向下钻取(展开),直到看到您需要其数据的属性。 此后,通过将每个向下钻取级别附加到您想要的参数来设置变量:
postman.setGlobalVariable("Session_Id", responseJson.UserSessionToken.SessionID);
在这种情况下,“responseJson”是对象,“UserSessionToken”是向下钻取的下一个级别,而 SessionId 是我需要的参数。
注意:这个答案是邮递员v7.15.0之前的正确解决方案。对于高于此的版本,接受的答案可能不起作用。
【讨论】:
如果您运行独立应用程序,则无需通过 Chrome 启用这些工具。只需从菜单栏中打开:查看 -> 显示邮递员控制台 要完成答案,如果像我一样,您的 xml 标记正在引用名称为 s:body 的 xmlns,只需将它们放在括号内,例如responseJson['S:Envelope']['S:Body'].activation
注意这个函数的名字是错误的——它没有返回JSON字符串,它返回一个JS对象,所以第一句应该是“先转换你的 XML 变成一个对象”。混淆这两个概念是一个非常糟糕的主意。【参考方案2】:
自 Postman v7.15.0 以来,接受的答案对我不起作用(它曾经在更新之前使用)。您必须将路径段放入方括号中。
例如,在以下 XML 响应中:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<QuotesPrivateResponse>
<lease-service>
<duration-in-months>24</duration-in-months>
</lease-service>
</QuotesPrivateResponse>
检索值duration-in-months:
var response = xml2Json(responseBody);
var duration = response["QuotesPrivateResponse"]["lease-service"]["duration-in-months"];
pm.environment.set("duration", duration);
【讨论】:
谢谢汤姆。像魅力一样工作。出于好奇,这是在哪里记录的?在 Postman 的官方文档上似乎找不到。 @Ash 抱歉,我一定在某个地方找到了它,但我现在不记得了。 问题不在版本中,带有破折号的json字段名是问题所在。示例:持续时间在月【参考方案3】:邮递员 v7.20.1
我想补充一下我的答案,因为上面有几个细节我花了一段时间才解决:
如何处理多部分 SOAP 响应 如何管理 JSON 对象 responseBody 定义这是我要分析的 XML 响应的第一行:
------=_Part_694527_1470506002.1584708814081
Content-Type: application/xop+xml;charset=UTF-8;type="text/xml"
Content-Transfer-Encoding: 8bit
Content-ID:
<e3bd82ac-d88f-49d4-8088-e07ff1c8d407>
<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<ns2:GenericResponse xmlns:ns2="http://XXXXXXXX">
<ns2:Service IdcService="XXXXXXXX">
<ns2:Document>
<ns2:Field name="XXXXXXXX:isSetDefault">1</ns2:Field>
<ns2:Field name="XXXXXXXX">CHECKIN_UNIVERSAL</ns2:Field>
在我注意到它是一个多部分之后,我最终完成了这个邮递员测试:
var response = pm.response.text();
var responseBody = response.substr(response.indexOf('<env:'));
pm.test("The body of the response is a valid XML", function ()
pm.expect(xml2Json(responseBody)).to.exist;
);
pm.test("UCM file upload checkin succesfull", function()
var responseJson = xml2Json(responseBody);
var JsonFields = (responseJson['env:Envelope']['env:Body']['ns2:GenericResponse']['ns2:Service']['ns2:Document']['ns2:Field']);
JsonFields.forEach( field =>
if (field.name == 'StatusMessage')
console.log("Field = " + field.name);
pm.expect(field.text().to.include("Successfully checked in"));
);
);
【讨论】:
以上是关于如何使用 Postman 从 XML 中提取变量?的主要内容,如果未能解决你的问题,请参考以下文章
Postman的使用——设置全局参数,参数的传递,从登录接口的响应body中提取数据更新全局参数,从响应cookie中提取数据更新全局变量
Postman的使用——设置全局参数,参数的传递,从登录接口的响应body中提取数据更新全局参数,从响应cookie中提取数据更新全局变量