【问题标题】:SOAP for NodeJS without using WSDL不使用 WSDL 的 NodeJS 的 SOAP
【发布时间】:2016-12-23 01:15:32
【问题描述】:

我正在处理仅支持 SOAP 的 Web 服务。另外,我有一个 NodeJS 应用程序,我应该通过soap调用使用这个服务。

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

【问题讨论】:

    标签: node.js soap wsdl node-soap


    【解决方案1】:

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

    在意识到这一点之后,我最终得出的解决方案是使用SoapUI 之类的桌面 SOAP 工具生成我需要的几个 SOAP 请求(认为是两个),然后使用 non-SOAP HTTP request library for node 简单地发送这些生成的请求。

    这是一个一直对我有用的例子:

    // 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 与其他请求相比如何工作。这并不是作为最佳实践的建议,而是可以帮助开发人员理解手头问题的信息。

    【讨论】:

    • 太棒了。谢谢!
    • 这是完美的。你这个巫师。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2014-12-30
    • 2023-03-09
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多