不使用 WSDL 的 NodeJS 的 SOAP
SOAP for NodeJS without using WSDL
我正在处理仅支持 SOAP 的 Web 服务。另外,我有一个 NodeJS 应用程序,我应该从那里通过 soap 调用使用此服务。
最大的问题是 Web 服务在任何地方都没有 WSDL api 描述。所以我的问题是,我如何使用 NodeJS,在没有 WSDL 的情况下使用 Soap?到目前为止,我检查过的所有 NodeJS 库都要求我给它们提供 WSDL url。我在这里找到了一个不需要的 C#:C#-soap-without-wsdl
我以前也遇到过这个问题。对于具有主要使用 RESTful API 经验的开发人员来说,要在合理的时间内掌握 SOAP 的基础知识尤其困难,更不用说能够调试其中的问题了。要记住的是,SOAP 使用与您可能习惯使用的 RESTful API 完全相同的应用层协议 (HTTP)。将有 headers、一个 uri、一个方法,就像您习惯的那样,唯一特别的是您格式化这些字段的方式。
意识到这一点后,我最终找到的解决方案是使用像 SoapUI and then simply send these generated requests using a non-SOAP HTTP request library for node 这样的桌面 SOAP 工具生成我需要的几个 SOAP 请求(认为是两个)。
这是一个对我一直有效的例子:
// 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 与其他请求相比如何工作。这并不是作为最佳实践的建议,而是可以帮助开发人员理解手头问题的信息。
我正在处理仅支持 SOAP 的 Web 服务。另外,我有一个 NodeJS 应用程序,我应该从那里通过 soap 调用使用此服务。
最大的问题是 Web 服务在任何地方都没有 WSDL api 描述。所以我的问题是,我如何使用 NodeJS,在没有 WSDL 的情况下使用 Soap?到目前为止,我检查过的所有 NodeJS 库都要求我给它们提供 WSDL url。我在这里找到了一个不需要的 C#:C#-soap-without-wsdl
我以前也遇到过这个问题。对于具有主要使用 RESTful API 经验的开发人员来说,要在合理的时间内掌握 SOAP 的基础知识尤其困难,更不用说能够调试其中的问题了。要记住的是,SOAP 使用与您可能习惯使用的 RESTful API 完全相同的应用层协议 (HTTP)。将有 headers、一个 uri、一个方法,就像您习惯的那样,唯一特别的是您格式化这些字段的方式。
意识到这一点后,我最终找到的解决方案是使用像 SoapUI and then simply send these generated requests using a non-SOAP HTTP request library for node 这样的桌面 SOAP 工具生成我需要的几个 SOAP 请求(认为是两个)。
这是一个对我一直有效的例子:
// 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 与其他请求相比如何工作。这并不是作为最佳实践的建议,而是可以帮助开发人员理解手头问题的信息。