2016-08-16 109 views
3

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

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

回答

7

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

在意识到这一点之后,我最终得出的解决方案是生成几个SOAP请求(认为它是两个),我需要使用桌面SOAP工具(如SoapUI),然后使用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 

UPDATE:底线是,这是一个解决办法,这有助于解释一个初学者SOAP作品相比其他请求如何。这并不意味着作为最佳实践的推荐,而是可以帮助开发人员理解手头问题的信息。

+0

辉煌。感谢你! –

+0

这是完美的。你向导。 – AlexMcG