如何使用 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中提取数据更新全局变量

如何从 POSTMAN 发送包含 xml 值的 Json?

Postman 可以将文件作为路径中的变量吗?

Postman:如何在请求正文中使用环境变量

如何使用目标 c 从 xml 信封中提取 xml 肥皂体?