2016-08-16 3 views
3

Ich habe es mit einem Web-Service zu tun, der nur SOAP unterstützt. Außerdem habe ich eine NodeJS-Anwendung, von wo aus ich diesen Dienst über Soap-Aufrufe nutzen soll.SOAP für NodeJS ohne WSDL

Das größte Problem ist, dass der Web Service nirgends eine WSDL API Beschreibung hat. Also meine Frage ist, wie könnte ich mit NodeJS Soap ohne WSDL verwenden? Alle Bibliotheken, die ich bisher für NodeJS überprüft habe, verlangen, dass ich ihnen die WSDL-URL gebe. Ich fand eine für C#, die nicht benötigt, hier: C#-soap-without-wsdl

Antwort

7

Ich habe dieses Problem in der Vergangenheit auch aufgetreten. Es ist besonders schwierig für Entwickler mit Erfahrung, meist REST-konforme APIs zu verwenden, um die Grundlagen von SOAP in einer vernünftigen Menge an Zeit zu finden, geschweige denn in der Lage zu sein, Probleme darin zu debuggen. Zu beachten ist, dass SOAP genau das gleiche Application-Layer-Protokoll (HTTP) verwendet wie die REST-APIs, mit denen Sie wahrscheinlich vertraut sind. Es wird Header geben, ein uri, eine Methode genau wie das, was Sie gewohnt sind, das einzige, was speziell ist die Art, wie Sie diese Felder formatieren.

Nachdem ich dies realisiert hatte, war die Lösung, die ich schließlich hatte, die wenigen SOAP-Anfragen zu generieren (ich denke, es waren zwei). Ich brauchte ein SOAP-Tool wie SoapUI und schickte dann diese generierten Anfragen einfach unter non-SOAP HTTP request library for node.

Hier ist ein Beispiel, das für mich konsequent gearbeitet:

// 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: Unterm Strich ist, dass dies ein Problem umgehen, die zu einem Anfänger erklären hilft, wie SOAP-Werke im Vergleich zu anderen Anfragen. Dies ist keine Empfehlung als Best Practice, sondern eine Information, die einem Entwickler helfen kann, das Problem zu verstehen.

+0

Brilliant. Danke dafür! –

+0

Das ist perfekt. Du Zauberer. – AlexMcG