Warm tip: This article is reproduced from serverfault.com, please click

web services-DataSink步骤返回所有子项的每个响应

(web services - DataSink step to return each response with all the children)

发布于 2020-12-02 06:16:36

我最近学习了如何在Ready API中使用数据驱动的测试以及如何基于数据进行循环调用。我的目标是循环运行这些步骤,最后使用DataSink创建一个自动导出工具,以便自动导出结果。

测试步骤

现在,当我尝试转到DataSink时,据我了解,我需要按如下方式创建列标题

数据接收器

存储相应的子值

映射

如果每个siteId的肥皂响应都具有相同的XML结构,它将很好地工作。但就我而言,我收到的每个2000多个回复中都有不同数量的孩子

 <retrun> </return>

例如,请查看响应1和响应2。这两个响应具有不同数量的子代。

回应1

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getSiteInfoResponse xmlns:ns2="http://billing.xyz.cc/">
         <return>
            <address1>A</address1>
            <city>B</city>
            <closeDate>2018-10-15T00:00:00-05:00</closeDate>
            <contact1/>
            <contact2>TBD</contact2>
            <country>X1</country>
            <customerNbr>288</customerNbr>
            <emailAddr1/>
            <emailAddr2/>
            <fax1>0</fax1>
            <fax2>0</fax2>
            <gps>C</gps>
            <grouping2>Leased</grouping2>
            <grouping4>D</grouping4>
            <jobTitle1/>
            <jobTitle2/>
            <phone1>0</phone1>
            <phone2>0</phone2>
            <siteId>862578</siteId>
            <siteName>D</siteName>
            <squareFoot>0.0</squareFoot>
            <state>E</state>
            <weatherStation>D</weatherStation>
            <zip4>4</zip4>
            <zip5>F</zip5>
        </return>
  </ns2:getSiteInfoResponse>
   </soap:Body>
</soap:Envelope>

回应2

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getSiteInfoResponse xmlns:ns2="http://billing.xyz.cc/">
         <return>
            <address1>1202</address1>
            <city>QA</city>
            <contact1/>
            <contact2>BL</contact2>
            <country>A</country>
            <customerNbr>288</customerNbr>
            <emailAddr1/>
        <emailAddr2/>
        <fax1>0</fax1>
        <fax2>0</fax2>
        <gps>LTE</gps>
        <grouping1>1345</grouping1>
        <grouping2>Leased</grouping2>
        <grouping3>ZX</grouping3>
        <grouping4>AA</grouping4>
        <grouping5>2000</grouping5>
        <jobTitle1/>
        <jobTitle2/>
        <phone1>0</phone1>
        <phone2>0</phone2>
        <services>
           <accountNbr>11099942</accountNbr>
           <liveDt>2013-07-01T00:00:00-05:00</liveDt>
           <service>2</service>
           <serviceType>gas</serviceType>
           <vendorAddr1/>
           <vendorAddr2>M</vendorAddr2>
           <vendorCity>N</vendorCity>
           <vendorName>O</vendorName>
           <vendorNbr>P</vendorNbr>
           <vendorPhone>Q</vendorPhone>
           <vendorState>R</vendorState>
           <vendorZip>S</vendorZip>
        </services>
        <services>
           <accountNbr>13064944</accountNbr>
           <liveDt>2018-05-20T00:00:00-05:00</liveDt>
           <service>2</service>
           <serviceType>gas</serviceType>
           <vendorAddr1/>
           <vendorAddr2>A</vendorAddr2>
           <vendorCity>B</vendorCity>
           <vendorName>C</vendorName>
           <vendorNbr>677</vendorNbr>
           <vendorPhone>D</vendorPhone>
           <vendorState>E</vendorState>
           <vendorZip>F</vendorZip>
        </services>      
        <siteId>101567</siteId>
        <siteName>X</siteName>
        <squareFoot>4226.0</squareFoot>
        <state>Y</state>
        <weatherStation>Z</weatherStation>
        <zip4>0</zip4>
        <zip5>L</zip5>
     </return>
  </ns2:getSiteInfoResponse>
   </soap:Body>
</soap:Envelope>

现在,我需要使用整个响应来进一步创建一个表,以用于商业智能。如果必须在DataSink中创建匹配的标头,则需要遍历每个响应,以确保已在datasink中创建了相应的属性。在不影响准确性的情况下,这是人为不可能的。

有什么方法可以对Ready API进行编程,以通过每次循环调用将单独的XML响应存储在我指定的文件中(2000+ XML响应),或者通过响应节点的子级存储所有值,而无需我指定所有标头名称在“数据接收器”窗口中。如果发生这种情况,在两种情况下我都可以利用BI工具从那里创建对应的表。

返回节点

先感谢你。

Questioner
smpa01
Viewed
0
smpa01 2020-12-03 02:34:33

@克里斯·亚当斯(Chris Adams)感谢你的出色创意。即使我不能完全将其付诸实践。但是由于你的想法(获取数据),我走了一条不同的路线,我得到了想要的东西。

这就是我所做的。我没有使用DataSink,而是使用创建文件。想法是,每当我安排此任务时,Ready API便可以循环运行整个过程并将结果扔到静态文件夹中

带有文件名

包含

从获取数据原始请求agr3获得的网站ID

${getSiteInfo#RawRequest#declare namespace bil='http://billing.xyz.cc/'; //bil:getSiteInfo[1]/arg3[1]}.xml

文件名

文件内容

来自根节点响应的完整响应

${getSiteInfo#Response#declare namespace soap='http://schemas.xmlsoap.org/soap/envelope/'; //soap:Envelope[1]}

档案内容

最终结果是这样

整体回应

但是,我仍然对此感兴趣,并且可以使这部分起作用。

That said, you can still use datasink to dump out all values in one go. In the datasink, create a single header and use 'get data' to select the root node of your response.