Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何使用Postman从XML中提取变量?_Json_Xml_Postman - Fatal编程技术网

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

Json 如何使用Postman从XML中提取变量?,json,xml,postman,Json,Xml,Postman,我试图从SOAP API返回的XML中提取SessionId 我已经通读了邮递员文档(好几遍了),但它对实现我的目标没有多大帮助 一些博客建议将XML转换为JSON,然后从中选择令牌及其值,但这也没有帮助 我在测试中使用了以下内容: var jsonObject = xml2Json(responseBody); postman.setGlobalVariable("Session_Id", jsonObject.SessionID); 上面创建了变量“Session_Id”,但实际上没有给它

我试图从SOAP API返回的XML中提取SessionId

我已经通读了邮递员文档(好几遍了),但它对实现我的目标没有多大帮助

一些博客建议将XML转换为JSON,然后从中选择令牌及其值,但这也没有帮助

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

var jsonObject = xml2Json(responseBody);
postman.setGlobalVariable("Session_Id", jsonObject.SessionID);
上面创建了变量“Session_Id”,但实际上没有给它赋值。我被难住了


我肯定是在从API中检索数据,它可以在Postman的“Body”响应中查看。

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

var responseJson = xml2Json(responseBody);
(其中“responseBody”是xml正文。) 然后使用console.log方法输出JSON数据,如下所示:

console.log(responseJson);
请确保已在上遵循本教程

在测试运行程序内部,运行测试,然后右键单击并“检查”运行程序中的任何位置。一旦Chrome的开发工具启动,选择“控制台”选项卡。展开“对象”部分

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

postman.setGlobalVariable("Session_Id", responseJson.UserSessionToken.SessionID); 
在本例中,“responseJson”是对象,“UserSessionToken”是向下钻取的下一个级别,SessionId是我在其中需要的参数


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

因为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>
邮递员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>
——=\u零件号\u 694527\u 1470506002.1584708814081
内容类型:应用程序/xop+xml;字符集=UTF-8;type=“text/xml”
内容传输编码:8比特
内容ID:
1.
签入通用
在我注意到这是一个多部分测试后,我最后做了一个邮递员测试:

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"));
        }
    }); 
});
var response=pm.response.text();

var responseBody=response.substr(response.indexOf('我仍在寻找答案,我正在与介绍我使用该应用程序的人进行确认。如果我在未来几天内没有及时赶到,我将向邮递员发送电子邮件。jsonObject的输出是什么,jsonObject.SessionID是字符串吗。根据邮递员文档:Postman.setGlobalVariable(variableName,variableValue):设置全局变量“variableName”,并指定字符串“variableValue”注意:只能存储字符串。存储其他类型的数据会导致意外行为。我给Postman@Shaughn发了电子邮件,他们的一位创始人回复了我同样的建议。但他接着说,该应用程序会自动将任何其他类型的数据转换为字符串。不管怎样,我发现了问题。我没有深入研究JSON blob.I最后使用:'postman.setEnvironmentVariable(“Session_Id”,jsonObject.UserSessionToken.SessionId)我使用Console.log并不断检查输出,直到找到所需的内容。如果运行独立应用程序,则无需通过Chrome启用这些工具。只需从菜单栏打开:View->Show Postman Console即可完成回答,如果像我一样,您的xml标记引用了名为s:body的XMLN,只需将它们放入即可侧括号类似于
responseJson['S:Envelope']['S:Body']]。激活
请注意,此函数的名称是错误的-它不返回JSON字符串,而是返回JS对象,因此第一句应为“首先将XML转换为对象”。混淆这两个概念是一个非常糟糕的主意。谢谢Tom。工作非常出色。出于好奇,这是在哪里记录的?在邮递员的官方文档中似乎找不到。@Ash抱歉,我一定是在什么地方找到的,但我现在记不起来了。问题不在版本中,问题是json字段名带破折号。例如:持续时间(以月为单位)s
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"));
        }
    }); 
});