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

svdrlsy4  于 2023-02-26  发布在  Postman
关注(0)|答案(3)|浏览(306)

我尝试从SOAP API返回的XML中提取SessionId。
我已经通读了Postman文档(好几遍了),但它对实现我的目标并没有多大帮助。
一些博客建议将XML转换为JSON,然后从中提取令牌及其值,但这也没有帮助。
我在测试中使用了以下内容:

var jsonObject = xml2Json(responseBody);
postman.setGlobalVariable("Session_Id", jsonObject.SessionID);

上面的代码创建了变量“Session_Id”,但实际上并没有给它赋值。
我肯定是从API中检索数据,并且可以在Postman的“Body”响应中查看。

33qvvth1

33qvvth11#

要使用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是我需要的参数。

:此答案是postman v7.15.0之前的正确解决方案。对于此版本之后的版本,已接受的答案可能不起作用。

sh7euo9m

sh7euo9m2#

自从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);

我强烈怀疑这种行为是在任何元素名包含连字符时引起的。

km0tfn4u

km0tfn4u3#

Postman 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>

在我注意到这是一个多部分之后,我用这个 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"));
        }
    }); 
});

相关问题