【问题标题】:API Access to SOAP using Node.JS, script not working使用 Node.JS 对 SOAP 的 API 访问,脚本不起作用
【发布时间】:2019-07-03 01:57:28
【问题描述】:

我是 SOAP 协议的新手,在生产环境中使用它之前尝试了一个工作测试 API。我在通过 SOAP 成功连接时遇到了一些问题

我研究了数周的帖子,尝试了 easy-soap-request、soap-node、axios 和其他模块,但没有成功。

const soapRequest = require('easy-soap-request');
const fs = require('fs');

// example data
const url = 'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL';
const headers = {
'soapAction': '<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.oorsprong.org/websamples.countryinfo">' +
'<soapenv:Header/>' +
'<soapenv:Body>' +
 '<web:CountryName>' +
    '<web:sCountryISOCode>COL</web:sCountryISOCode>' +
 '</web:CountryName>' +
'</soapenv:Body>' +
'</soapenv:Envelope>'
};
const xml = fs.readFileSync('test/zipCodeEnvelope.xml', 'utf-8');

// usage of module
(async () => {
const { response } = await soapRequest(url, headers, xml, 1000); // 
Optional timeout parameter(milliseconds)
const { body, statusCode } = response;
console.log(body);
console.log(statusCode);
})();

下面列出的错误消息。

C:\Program Files\nodejs>node test.js
SOAP FAIL: Error: Request failed with status code 500
(node:14196) UnhandledPromiseRejectionWarning: 
C:\Program Files\nodejs>node test.js
SOAP FAIL: Error: Request failed with status code 415
(node:14836) UnhandledPromiseRejectionWarning: The server cannot service the request because the media type is unsupported.
(node:14836) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:14836) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

【问题讨论】:

    标签: node.js api soap


    【解决方案1】:

    根据此处的示例: https://www.npmjs.com/package/easy-soap-request

    您需要在标题中设置内容类型

    const url = 'https://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php';
    const headers = {
      'user-agent': 'sampleTest',
      'Content-Type': 'text/xml;charset=UTF-8',
      'soapAction': 'https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl#LatLonListZipCode',
    };
    
    

    这是一个对我有用的完整示例。也许是你的肥皂信封有问题?

    const soapRequest = require('easy-soap-request');                          const fs = require('fs');                                                  // example data                                                            const url = 'https://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php';
    const headers = {
      'user-agent': 'sampleTest',
      'Content-Type': 'text/xml;charset=UTF-8',
      'soapAction': 'https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl#LatLonListZipCode',                                                      };                                                                         
    const xml = `<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>                                                            <ns3591:NDFDgen xmlns:ns3591="uri:DWMLgen">
    <latitude xsi:type="xsd:string">38.99</latitude>
    <longitude xsi:type="xsd:string">-77.01</longitude>                        <product xsi:type="xsd:string">time-series</product>
    <startTime xsi:type="xsd:string">2019-07-04T00:00:00</startTime>
    <endTime xsi:type="xsd:string">2019-07-06T00:00:00</endTime>
    <Unit xsi:type="xsd:string">e</Unit>
    <weatherParameters>                                                       
     <maxt xsi:type="xsd:boolean">1</maxt>
    <mint xsi:type="xsd:boolean">0</mint>                                      <temp xsi:type="xsd:boolean">0</temp>                                      <td xsi:type="xsd:boolean">0</td>                                          <pop12 xsi:type="xsd:boolean">0</pop12>                                    <qpf xsi:type="xsd:boolean">0</qpf>                                        <sky xsi:type="xsd:boolean">0</sky>                                        <snow xsi:type="xsd:boolean">0</snow>                                      <wspd xsi:type="xsd:boolean">0</wspd>
    <wdir xsi:type="xsd:boolean">0</wdir>
    <wx xsi:type="xsd:boolean">0</wx>
    <waveh xsi:type="xsd:boolean">0</waveh>
    <icons xsi:type="xsd:boolean">0</icons>
    <critfireo xsi:type="xsd:boolean">0</critfireo>
    <dryfireo xsi:type="xsd:boolean">0</dryfireo>
    <rhm xsi:type="xsd:boolean">0</rhm>
    <apt xsi:type="xsd:boolean">0</apt>
    <tcwspdabv34i xsi:type="xsd:boolean">0</tcwspdabv34i>
    <tcwspdabv50i xsi:type="xsd:boolean">0</tcwspdabv50i>
    <tcwspdabv64i xsi:type="xsd:boolean">0</tcwspdabv64i>
    <tcwspdabv34c xsi:type="xsd:boolean">0</tcwspdabv34c>
    <tcwspdabv50c xsi:type="xsd:boolean">0</tcwspdabv50c>
    <tcwspdabv64c xsi:type="xsd:boolean">0</tcwspdabv64c>
    <conhazo xsi:type="xsd:boolean">0</conhazo>
    <ptornado xsi:type="xsd:boolean">0</ptornado>
    <phail xsi:type="xsd:boolean">0</phail>
    <ptstmwinds xsi:type="xsd:boolean">0</ptstmwinds>
    <pxtornado xsi:type="xsd:boolean">0</pxtornado>
    <pxhail xsi:type="xsd:boolean">0</pxhail>
    <pxtstmwinds xsi:type="xsd:boolean">0</pxtstmwinds>
    <ptotsvrtstm xsi:type="xsd:boolean">0</ptotsvrtstm>
    <ptotxsvrtstm xsi:type="xsd:boolean">0</ptotxsvrtstm>
    <tmpabv14d xsi:type="xsd:boolean">0</tmpabv14d>
    <tmpblw14d xsi:type="xsd:boolean">0</tmpblw14d>
    <tmpabv30d xsi:type="xsd:boolean">0</tmpabv30d>
    <tmpblw30d xsi:type="xsd:boolean">0</tmpblw30d>
    <tmpabv90d xsi:type="xsd:boolean">0</tmpabv90d>
    <tmpblw90d xsi:type="xsd:boolean">0</tmpblw90d>
    <prcpabv14d xsi:type="xsd:boolean">0</prcpabv14d>
    <prcpblw14d xsi:type="xsd:boolean">0</prcpblw14d>
    <prcpabv30d xsi:type="xsd:boolean">0</prcpabv30d>
    <prcpblw30d xsi:type="xsd:boolean">0</prcpblw30d>
    <prcpabv90d xsi:type="xsd:boolean">0</prcpabv90d>
    <prcpblw90d xsi:type="xsd:boolean">0</prcpblw90d>
    <precipa_r xsi:type="xsd:boolean">0</precipa_r>
    <sky_r xsi:type="xsd:boolean">0</sky_r>
    <td_r xsi:type="xsd:boolean">0</td_r>
    <temp_r xsi:type="xsd:boolean">0</temp_r>
    <wdir_r xsi:type="xsd:boolean">0</wdir_r>
    <wspd_r xsi:type="xsd:boolean">0</wspd_r>                                  
    <wgust xsi:type="xsd:boolean">0</wgust>
    <iceaccum xsi:type="xsd:boolean">0</iceaccum>                              
    <maxrh xsi:type="xsd:boolean">0</maxrh>                                    
    <minrh xsi:type="xsd:boolean">0</minrh>                                    
    </weatherParameters>                                                       
    </ns3591:NDFDgen>                                                          
    </SOAP-ENV:Body>                                                           
    </SOAP-ENV:Envelope>`;                                                     
    (async () => {
      const { response } = await soapRequest(url, headers, xml, 4000); // Optional timeout parameter(milliseconds)
      const { respHeaders, body, statusCode } = response;                        
    console.log(respHeaders);                                                  
    console.log(body);                                                         
    console.log(statusCode);
    })();
    
    

    【讨论】:

    • 您好,不幸的是,我在执行此操作时似乎仍然收到错误 500。我在 SoapUI 中进行了测试,您是否偶然知道我将如何传递这些参数? schemas.xmlsoap.org/soap/envelope" xmlns:web="oorsprong.org/websamples.countryinfo">
      COL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2013-11-12
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2021-02-13
    • 2012-01-28
    相关资源
    最近更新 更多