不使用WSDL的NodeJS SOAP

时间:2016-08-16 15:21:06

标签: node.js soap wsdl node-soap

我正在处理仅支持SOAP的Web服务。此外,我有一个NodeJS应用程序,从那里我应该通过肥皂调用来使用这项服务。

最大的问题是,Web服务在任何地方都没有WSDL API描述。所以我的问题是,我如何使用NodeJS,在没有WSDL的情况下使用Soap?到目前为止,我检查过NodeJS的所有库都要求我给它们WSDL url。我找到了一个不需要的C#,在这里:C#-soap-without-wsdl

1 个答案:

答案 0 :(得分:10)

我过去也遇到过这个问题。对于具有使用大多数RESTful API的经验的开发人员来说,特别难以在合理的时间内完成SOAP的基础知识,更不用说能够调试其中的问题了。要记住的是SOAP使用与您可能习惯使用的RESTful API完全相同的应用程序层协议(HTTP)。会有标题,一个uri,一种方法就像你习惯的一样,唯一特别的就是格式化这些字段的方式

在意识到这一点之后,我最终得出的解决方案是生成一些SOAP请求(认为它是两个)我需要使用像SoapUI这样的桌面SOAP工具,然后使用{{{}}发送这些生成的请求。 3}}。

这是一个一直为我工作的例子:

// SOAP
var requestBody =
  '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ' +
  'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ><soap:Header>' +
  '<SOAPAction>addRoom' +
  '</SOAPAction></soap:Header><soap:Body><AddRoomRequest ' +
  'xmlns="http://portal.vidyo.com/admin/v1_1"><room><name>' +
  params.conferenceName + '</name><RoomType>Public</RoomType><ownerName>' +
  vidyoApiUsername  + '</ownerName>' + '<extension>' +
  params.conferenceExtension  +
  '</extension><groupName>Default</groupName><RoomMode><isLocked>' +
  'false</isLocked><hasPIN>false</hasPIN><hasModeratorPIN>false' +
  '</hasModeratorPIN></RoomMode></room></AddRoomRequest></soap:Body>' +
  '</soap:Envelope>';

var requestHeaders = {
  'cache-control': 'no-cache',
  'soapaction': 'addRoom',
  'content-type': 'text/xml;charset=UTF-8'
};

var requestOptions = {
  'method': 'POST',
  'url': vidyoApiEndpoint,
  'qs': { 'wsdl': ''},
  'headers': requestHeaders,
  'body': requestBody,
  'timeout': 5000
};

request(requestOptions, function (error, response, body) {
  if (error) {
    // handle error
  } else {
    try {
      var parsingOptions = {
        'object': true,
        'sanitize': false
      };
      var jsonResult = parser.toJson(body, parsingOptions); // from xml
      if(jsonResult['soapenv:Envelope']
        ['soapenv:Body']
        ['ns1:AddRoomResponse']
        ['ns1:OK'] === 'OK') {
          conferenceInfo(req, res, next, params);
      } else {
       // handle error
      }
    } catch (e) {
      // handle error
    }
   }
}).auth(vidyoApiUsername, vidyoApiPassword); 
// you can remove this .auth if your api has no authentication

更新:最重要的是,这是一种解决方法,有助于向初学者解释SOAP与其他请求相比如何工作。这不是一种建议,而是一种最佳实践,而是可以帮助开发人员理解手头问题的信息。