Pregunta Node.js: cómo consumir el servicio web XML SOAP


Me pregunto cuál es la mejor manera de consumir el servicio web XML SOAP con node.js

¡Gracias!


76
2017-12-28 11:22


origen


Respuestas:


No tienes tantas opciones.

Probablemente quieras usar uno de:


67
2017-12-28 11:49



Creo que una alternativa sería:

Sí, este es un enfoque bastante sucio y de bajo nivel, pero debería funcionar sin problemas


27
2018-04-06 17:24



La forma más simple que encontré para enviar XML sin formato a un servicio SOAP utilizando Node.js es usar la implementación http de Node.js. Se parece a esto.

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();

Habría definido la variable xml como el xml sin formato en forma de cadena.

Pero si solo desea interactuar con un servicio SOAP a través de Node.js y realizar llamadas SOAP regulares, en lugar de enviar xml sin formato, use una de las bibliotecas de Node.js. me gusta nodo-jabón.


13
2018-05-20 18:57



Me las arreglé para usar soap, wsdl y Node.js Necesita instalar jabón con npm install soap

Crear un servidor de nodo llamado server.js que definirá el servicio de soap para ser consumido por un cliente remoto. Este servicio de jabón calcula el índice de masa corporal en función del peso (kg) y la altura (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);

Luego, crea un client.js archivo que consumirá el servicio de jabón definido por server.js. Este archivo proporcionará argumentos para el servicio soap y llamará a la url con los puertos de servicio y endpoints de SOAP.

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);
}
})
}
});

Su archivo wsdl es un protocolo basado en xml para el intercambio de datos que define cómo acceder a un servicio web remoto. Llame a su archivo wsdl 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>

Espero eso ayude


11
2018-01-24 20:02



Dependiendo de la cantidad de puntos finales que necesite, puede ser más fácil hacerlo manualmente.

He intentado 10 bibliotecas "soap nodejs". Finalmente lo hago de forma manual.


9
2018-02-20 22:17



Si node-soap no funciona para ti, solo usa node  request módulo y luego convertir el xml a json si es necesario.

Mi solicitud no funcionaba node-soap y no hay soporte para ese módulo más allá del soporte pago, que fue más allá de mis recursos. Entonces hice lo siguiente:

  1. descargado SoapUI en mi máquina Linux.
  2. copiado el WSDL xml a un archivo local
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. En SoapUI fui a File > New Soap project y cargué mi wsdl_file.xml.
  4. En el navegador expandí uno de los servicios y hice clic derecho la solicitud y haga clic en Show Request Editor.

Desde allí podría enviar una solicitud y asegurarme de que funcionó y también pude usar la Rawo HTML datos para ayudarme a construir una solicitud externa.

Raw de SoapUI para mi solicitud

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 de 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> 

Usé lo anterior para construir lo siguiente 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



Utilicé con éxito el paquete "jabón" (https://www.npmjs.com/package/soap) en más de 10 rastreos de WebApis (Tradetracker, Bbelboon, Affilinet, Webgains, ...).

Los problemas generalmente provienen del hecho de que los programadores no investigan demasiado acerca de qué API remota necesita para conectarse o autenticarse.

Por ejemplo, PHP reenvía automáticamente las cookies de los encabezados HTTP, pero cuando se usa el paquete 'node', debe establecerse explícitamente (por ejemplo, mediante el paquete 'soap-cookie') ...


7
2018-04-17 16:11



También puede consultar las npm de easysoap: https://www.npmjs.org/package/easysoap -o- algunos de estos: https://nodejsmodules.org/tags/soap

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


5
2018-06-28 19:19