Frage Node.js: Wie verwende ich den SOAP XML-Webdienst?


Ich frage mich, was ist der beste Weg, um SOAP XML-Web-Service mit node.js zu konsumieren

Vielen Dank!


76
2017-12-28 11:22


Ursprung


Antworten:


Sie haben nicht so viele Optionen.

Du wirst wahrscheinlich eines der folgenden benutzen wollen:


67
2017-12-28 11:49



Ich denke, dass eine Alternative wäre:

Ja, das ist ein ziemlich dreckiger Ansatz auf niedriger Ebene, aber es sollte ohne Probleme funktionieren


27
2018-04-06 17:24



Der einfachste Weg, um XML-Rohdaten mithilfe von Node.js an einen SOAP-Service zu senden, ist die Verwendung der http-Implementierung von Node.js. Es sieht aus wie das.

var http = require('http');
var http_options = {
  hostname: 'localhost',
  port: 80,
  path: '/LocationOfSOAPServer/',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': xml.length
  }
}

var req = http.request(http_options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });

  res.on('end', () => {
    console.log('No more data in response.')
  })
});

req.on('error', (e) => {
  console.log(`problem with request: ${e.message}`);
});

// write data to request body
req.write(xml); // xml would have been set somewhere to a complete xml document in the form of a string
req.end();

Sie hätten die XML-Variable als rohe XML in Form einer Zeichenfolge definiert.

Wenn Sie jedoch nur mit einem SOAP-Service über Node.js interagieren und normale SOAP-Aufrufe durchführen möchten, verwenden Sie im Gegensatz zum Senden von Roh-XML eine der Node.js-Bibliotheken. ich mag Knoten-Seife.


13
2018-05-20 18:57



Ich habe es geschafft, soap, wsdl und Node.js zu verwenden Sie müssen Seife mit installieren npm install soap

Erstellen Sie einen Node-Server namens server.js Dadurch wird der Soap-Service definiert, der von einem Remote-Client verwendet werden soll. Dieser Seifenservice berechnet den Body Mass Index basierend auf Gewicht (kg) und Höhe (m).

var soap = require('soap');
var express = require('express');
var app = express();
/** 
-this is remote service defined in this file, that can be accessed by clients, who will supply args
-response is returned to the calling client
-our service calculates bmi by dividing weight in kilograms by square of height in metres
**/
var service = {
    BMI_Service : {
        BMI_Port :{
            calculateBMI:function(args){
                //console.log(Date().getFullYear())
                var year = new Date().getFullYear();
                var n = (args.weight)/(args.height*args.height);
                console.log(n);
                return {bmi: n};
            }
        }
   }
}
// xml data is extracted from wsdl file created
var xml = require('fs').readFileSync('./bmicalculator.wsdl','utf8');
//create an express server and pass it to a soap server
var server = app.listen(3030,function(){
var host = "127.0.0.1";
var port = server.address().port;
});
`soap.listen(server,'/bmicalculator',service,xml);

Als nächstes erstellen Sie ein client.js Datei, die den Soap-Service von definiert server.js. Diese Datei enthält Argumente für den Soap-Service und ruft die URL mit den Service-Ports und -Endpunkten von SOAP auf.

var express = require('express');
var soap = require('soap');
var url = "http://localhost:3030/bmicalculator?wsdl";
var args = {weight:65.7,height:1.63};
soap.createClient(url,function(err,client){
if(err)
console.error(err);
else {
client.calculateBMI(args,function(err,response){
if(err)
console.error(err);
else {
console.log(response);
res.send(response);
}
})
}
});

Ihre WSDL-Datei ist ein XML-basiertes Protokoll für den Datenaustausch, das den Zugriff auf einen Remote-Webdienst definiert. Rufen Sie Ihre WSDL-Datei an bmicalculator.wsdl

<definitions name="HelloService"
targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<message name="getBMIRequest">
<part name="weight" type="xsd:float"/>
<part name="height" type="xsd:float"/>
</message>

<message name="getBMIResponse">
<part name="bmi" type="xsd:float"/>
</message>

<portType name="Hello_PortType">
<operation name="calculateBMI">
<input message="tns:getBMIRequest"/>
<output message="tns:getBMIResponse"/>
</operation>
</portType>

<binding name="Hello_Binding" type="tns:Hello_PortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="calculateBMI">
<soap:operation soapAction="calculateBMI"/>
<input>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</input>
<output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</output>
</operation>
</binding>

<service name="BMI_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="BMI_Port">
<soap:address
location="http://localhost:3030/bmicalculator/" />
</port>
</service>
</definitions>

Ich hoffe es hilft


11
2018-01-24 20:02



Abhängig von der Anzahl der Endpunkte, die Sie benötigen, ist es möglicherweise einfacher, dies manuell zu tun.

Ich habe 10 Bibliotheken "soap nodejs" ausprobiert ich mache es endlich manuell.


9
2018-02-20 22:17



Ob node-soap funktioniert nicht für dich, benutze einfach node  request Modul und dann konvertieren Sie das XML in JSON, falls erforderlich.

Meine Anfrage hat nicht funktioniert node-soap und es gibt keine Unterstützung für dieses Modul über die bezahlte Unterstützung hinaus, die über meine Ressourcen hinausging. Also habe ich folgendes gemacht:

  1. heruntergeladen SoapUI auf meiner Linux-Maschine.
  2. Die WSDL-XML-Datei wurde in eine lokale Datei kopiert
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. In SoapUI ging ich zu File > New Soap project und hat meine hochgeladen wsdl_file.xml.
  4. Im Navigator habe ich einen der Dienste erweitert und mit der rechten Maustaste geklickt die Anfrage und klickte auf Show Request Editor.

Von dort konnte ich eine Anfrage senden und sicherstellen, dass es funktioniert und ich könnte auch die Rawoder HTML Daten, die mir helfen, eine externe Anfrage zu erstellen.

Roh von SoapUI für meine Anfrage

POST http://192.168.0.28:10005/MainService/WindowsService HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://Main.Service/AUserService/GetUsers"
Content-Length: 303
Host: 192.168.0.28:10005
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

XML von SoapUI

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qtre="http://Main.Service">
   <soapenv:Header/>
   <soapenv:Body>
      <qtre:GetUsers>
         <qtre:sSearchText></qtre:sSearchText>
      </qtre:GetUsers>
   </soapenv:Body>
</soapenv:Envelope> 

Ich habe das obige verwendet, um folgendes zu erstellen node  request:

var request = require('request');
let xml =
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qtre="http://Main.Service">
   <soapenv:Header/>
   <soapenv:Body>
      <qtre:GetUsers>
         <qtre:sSearchText></qtre:sSearchText>
      </qtre:GetUsers>
   </soapenv:Body>
</soapenv:Envelope>`

var options = {
  url: 'http://192.168.0.28:10005/MainService/WindowsService?wsdl',
  method: 'POST',
  body: xml,
  headers: {
    'Content-Type':'text/xml;charset=utf-8',
    'Accept-Encoding': 'gzip,deflate',
    'Content-Length':xml.length,
    'SOAPAction':"http://Main.Service/AUserService/GetUsers"
  }
};

let callback = (error, response, body) => {
  if (!error && response.statusCode == 200) {
    console.log('Raw result', body);
    var xml2js = require('xml2js');
    var parser = new xml2js.Parser({explicitArray: false, trim: true});
    parser.parseString(body, (err, result) => {
      console.log('JSON result', result);
    });
  };
  console.log('E', response.statusCode, response.statusMessage);  
};
request(options, callback);

8
2017-08-29 02:26



Ich habe erfolgreich "Seife" -Paket verwendet (https://www.npmjs.com/package/soap) auf mehr als 10 Tracking WebApis (Tradetracker, Bbelboon, Affilinet, Webgains, ...).

Probleme ergeben sich normalerweise aus der Tatsache, dass Programmierer nicht zu viel darüber nachdenken, was Remote-API benötigt, um sich zu verbinden oder zu authentifizieren.

Zum Beispiel sendet PHP Cookies automatisch von HTTP-Headern, aber wenn das 'node' Paket verwendet wird, muss es explizit gesetzt werden (zum Beispiel durch 'soap-cookie' Paket) ...


7
2018-04-17 16:11



Sie können sich auch den easysoap npm ansehen - https://www.npmjs.org/package/easysoap -oder- einige davon: https://nodejsmodules.org/tags/soap

https://nodejsmodules.org/pkg/express-soap2json


5
2018-06-28 19:19



Ich benutzte das Node-Net-Modul, um einen Socket zum Webservice zu öffnen.

/* on Login request */
socket.on('login', function(credentials /* {username} {password} */){   
    if( !_this.netConnected ){
        _this.net.connect(8081, '127.0.0.1', function() {
            logger.gps('('+socket.id + ') '+credentials.username+' connected to: 127.0.0.1:8081');
            _this.netConnected = true;
            _this.username = credentials.username;
            _this.password = credentials.password;
            _this.m_RequestId = 1;
            /* make SOAP Login request */
            soapGps('', _this, 'login', credentials.username);              
        });         
    } else {
        /* make SOAP Login request */
        _this.m_RequestId = _this.m_RequestId +1;
        soapGps('', _this, 'login', credentials.username);          
    }
});

Sende Soap-Anfragen

/* SOAP request func */
module.exports = function soapGps(xmlResponse, client, header, data) {
    /* send Login request */
    if(header == 'login'){
        var SOAP_Headers =  "POST /soap/gps/login HTTP/1.1\r\nHost: soap.example.com\r\nUser-Agent: SOAP-client/SecurityCenter3.0\r\n" +
                            "Content-Type: application/soap+xml; charset=\"utf-8\"";        
        var SOAP_Envelope=  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                            "<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:n=\"http://www.example.com\"><env:Header><n:Request>" +
                            "Login" +
                            "</n:Request></env:Header><env:Body>" +
                            "<n:RequestLogin xmlns:n=\"http://www.example.com.com/gps/soap\">" +
                            "<n:Name>"+data+"</n:Name>" +
                            "<n:OrgID>0</n:OrgID>" +                                        
                            "<n:LoginEntityType>admin</n:LoginEntityType>" +
                            "<n:AuthType>simple</n:AuthType>" +
                            "</n:RequestLogin></env:Body></env:Envelope>";

        client.net.write(SOAP_Headers + "\r\nContent-Length:" + SOAP_Envelope.length.toString() + "\r\n\r\n");
        client.net.write(SOAP_Envelope);
        return;
    }

Parse Seife Antwort, ich verwendete Modul - xml2js

var parser = new xml2js.Parser({
    normalize: true,
    trim: true,
    explicitArray: false
});
//client.net.setEncoding('utf8');

client.net.on('data', function(response) {
    parser.parseString(response);
});

parser.addListener('end', function( xmlResponse ) {
    var response = xmlResponse['env:Envelope']['env:Header']['n:Response']._;
    /* handle Login response */
    if (response == 'Login'){
        /* make SOAP LoginContinue request */
        soapGps(xmlResponse, client, '');
    }
    /* handle LoginContinue response */
    if (response == 'LoginContinue') {
        if(xmlResponse['env:Envelope']['env:Body']['n:ResponseLoginContinue']['n:ErrCode'] == "ok") {           
            var nTimeMsecServer = xmlResponse['env:Envelope']['env:Body']['n:ResponseLoginContinue']['n:CurrentTime'];
            var nTimeMsecOur = new Date().getTime();
        } else {
            /* Unsuccessful login */
            io.to(client.id).emit('Error', "invalid login");
            client.net.destroy();
        }
    }
});

Hoffe es hilft jemandem


5
2017-11-14 10:46



Hinzufügen zu Kim .Js Lösung: Du kannst hinzufügen preserveWhitespace=true um einen Whitespace-Fehler zu vermeiden. So was:

soap.CreateClient(url,preserveWhitespace=true,function(...){

0
2018-01-10 19:36