如何使用Postman从XML中提取变量?

Kyl*_*iss 9 xml json postman

我正在尝试从SOAP API中提取的XML中提取SessionId.

我已经阅读了Postman文档(多次),但它对实现我的目标并不是最有帮助的.

在一些博客中建议的是将XML转换为JSON,然后从那里挑选令牌及其值,但这也没有帮助.

我在我的测试中使用了以下内容:

var jsonObject = xml2Json(responseBody);
postman.setGlobalVariable("Session_Id", jsonObject.SessionID);
Run Code Online (Sandbox Code Playgroud)

上面创建了变量"Session_Id"但实际上并没有为它赋值.我很难过.

我肯定是从API中检索数据,并且可以在Postman的"Body"响应中查看.

Kyl*_*iss 22

要使用Postman从XML中提取变量,首先使用xml2Json转换器方法将XML转换为JSON:

var responseJson = xml2Json(responseBody);
Run Code Online (Sandbox Code Playgroud)

(其中"responseBody"是您的xml主体.)然后使用console.log方法输出您的JSON数据,如下所示:

console.log(responseJson);
Run Code Online (Sandbox Code Playgroud)

请务必遵循本教程中的Postman中的启用Chrome开发工具

在Test Runner中,运行测试,然后右键单击并在Runner中的任何位置"Inspect".Chrome的Dev Tools启动后,选择"控制台"选项卡.展开"对象"部分.

然后向下钻取(展开),直到您看到属性所需的属性.之后,通过将每个向下钻取级别附加到所需参数来设置变量:

postman.setGlobalVariable("Session_Id", responseJson.UserSessionToken.SessionID); 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"responseJson"是对象,"UserSessionToken"是下钻中的下一个级别,而SessionId是我需要的参数.

  • 如果您运行独立应用,则无需通过Chrome启用这些工具.只需从菜单栏打开:查看 - >显示邮递员控制台 (5认同)
  • 要完成答案,如果像我一样,您的xml标记正在引用名称为s:body的xmlns,只需将其放在方括号内,例如“ responseJson ['S:Envelope'] ['S:Body']。activation” (4认同)

tom*_*ern 10

从 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>
Run Code Online (Sandbox Code Playgroud)

检索值duration-in-month

var response = xml2Json(responseBody);
var duration = response["QuotesPrivateResponse"]["lease-service"]["duration-in-months"];
pm.environment.set("duration", duration);
Run Code Online (Sandbox Code Playgroud)

  • 问题不在于版本,问题在于带有破折号的 json 字段名称。示例:持续时间(以月为单位) (3认同)
  • 谢谢汤姆。工作起来就像一个魅力。出于好奇,这在哪里记录?在Postman的官方文档中似乎找不到它。 (2认同)

bas*_*sta 5

邮递员 v7.20.1

我想添加我的答案,因为上面有几个细节让我花了一段时间才解决:

  • 如何处理多部分 SOAP 响应
  • 如何管理 JSON 对象
  • 响应体定义

这是我要分析的 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>
Run Code Online (Sandbox Code Playgroud)

在我注意到它是一个多部分之后,我最终得到了这个 Postman 测试:

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"));
        }
    }); 
});
Run Code Online (Sandbox Code Playgroud)