En caso de que use node-soap y descubra cómo usarlo, ¿podría ayudarme a crear un wsdl. ¿Existe un generador o un buen tutorial sobre cómo escribir el archivo wsdl. stackoverflow.com/questions/32480481/…
Gracias. teniendo problemas con la instalación de node-soap porque falla la instalación de node-expat = (
WHITECOLOR
Necesitará encabezados de desarrollo de expatriados para construirlo
Juicy Scripter
Encontré que el problema se ha dicho sobre los encabezados, pero no sé dónde debería conseguirlo, dónde debería ponerlo para compilarlo, ¿podría explicarme, por favor?
WHITECOLOR
1
Probablemente pueda obtenerlos a través de herramientas de administración de paquetes para su sistema operativo. En Ubuntu, por ejemplosudo apt-get install libexpat1-dev
Juicy Scripter
1
@RobertBroden, gracias por la actualización. La próxima vez, edite la respuesta (o sugiera una edición).
Juicy Scripter
31
Creo que una alternativa sería:
utilice una herramienta como SoapUI ( http://www.soapui.org ) para registrar los mensajes xml de entrada y salida
Lamentablemente, este es el método más confiable para interactuar con SOAP con Node.js. Todavía tengo que encontrar una sola biblioteca de jabones que realice correctamente las solicitudes de jabón en el puñado de API que tengo que usar.
AlbertEngelB
1
100% sucio, pero me llevó a los resultados)))
markkillah
¿A qué se refieren exactamente con formar la entrada xml` exactamente?
timaschew
sí, aún puedo confirmar que ninguna de las bibliotecas mencionadas anteriormente funciona perfectamente.
someUser
Creo que "XML de entrada de formulario" significa simplemente dar un tipo de contenido de "texto / xml"
SSH Este
22
Si node-soapno funciona para usted, simplemente use el noderequestmódulo y luego convierta el xml a json si es necesario.
Mi solicitud no funcionaba node-soapy no hay soporte para ese módulo más allá del soporte pagado, que estaba más allá de mis recursos. Entonces hice lo siguiente:
copió el xml WSDL en un archivo local curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
En SoapUI fui File > New Soap projecty subí mi wsdl_file.xml.
En el navegador expandí uno de los servicios, hice clic con el botón derecho en la solicitud y en Show Request Editor.
A partir de ahí me podría enviar una solicitud y asegurarse de que funcionaba y yo también podría utilizar el RawoHTML datos para ayudarme a crear una solicitud externa.
Raw de SoapUI para mi solicitud
POST http://192.168.0.28:10005/MainService/WindowsService HTTP/1.1Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8SOAPAction:"http://Main.Service/AUserService/GetUsers"Content-Length:303Host:192.168.0.28:10005Connection:Keep-AliveUser-Agent:Apache-HttpClient/4.1.1(java 1.5)
gracias @jtlindsey. Pero obtengo el método 405 no permitido como response.statusCode, response.statusMessage. Por casualidad, ¿sabe cómo solucionar este problema?
Sujoy
Hubo un problema con mi URL. Estaba usando la URL original en lugar del punto final generado por SOAPUI. Gracias por el código anterior.
Sujoy
17
Me las arreglé para usar soap, wsdl y Node.js Necesitas instalar soap con npm install soap
Cree un servidor de nodo llamado server.jsque definirá el servicio de jabón 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).
const soap =require('soap');const express =require('express');const 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
*/const service ={
BMI_Service:{
BMI_Port:{
calculateBMI(args){//console.log(Date().getFullYear())const year =newDate().getFullYear();const n = args.weight /(args.height * args.height);
console.log(n);return{ bmi: n };}}}};// xml data is extracted from wsdl file createdconst xml =require('fs').readFileSync('./bmicalculator.wsdl','utf8');//create an express server and pass it to a soap serverconst server = app.listen(3030,function(){const host ='127.0.0.1';const port = server.address().port;});
soap.listen(server,'/bmicalculator', service, xml);
A continuación, cree un client.jsarchivo 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 los puntos finales de SOAP.
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 wsdlbmicalculator.wsdl
<definitionsname="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"><messagename="getBMIRequest"><partname="weight"type="xsd:float"/><partname="height"type="xsd:float"/></message><messagename="getBMIResponse"><partname="bmi"type="xsd:float"/></message><portTypename="Hello_PortType"><operationname="calculateBMI"><inputmessage="tns:getBMIRequest"/><outputmessage="tns:getBMIResponse"/></operation></portType><bindingname="Hello_Binding"type="tns:Hello_PortType"><soap:bindingstyle="rpc"transport="http://schemas.xmlsoap.org/soap/http"/><operationname="calculateBMI"><soap:operationsoapAction="calculateBMI"/><input><soap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="urn:examples:helloservice"use="encoded"/></input><output><soap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="urn:examples:helloservice"use="encoded"/></output></operation></binding><servicename="BMI_Service"><documentation>WSDL File for HelloService</documentation><portbinding="tns:Hello_Binding"name="BMI_Port"><soap:addresslocation="http://localhost:3030/bmicalculator/"/></port></service></definitions>
Muchas gracias. Sin embargo, tuve que eliminar "res.send (respuesta);" desde el cliente y "` "en la última línea del archivo del servidor.
Subhashi
13
La forma más sencilla que encontré para enviar XML sin formato a un servicio SOAP usando 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 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 el jabón de nodos .
Probé node-soap para acceder a la ruta wsdl pero no funciona, sigo recibiendo errores aunque lo mismo funciona en php ¿Pueden responder mi pregunta sobre cómo lo hicieron? Stackoverflow.com/questions/39943122/…
Ammar Ajmal
8
Utilicé con éxito el paquete "soap" ( https://www.npmjs.com/package/soap ) en más de 10 WebApis de seguimiento (Tradetracker, Bbelboon, Affilinet, Webgains, ...).
Los problemas generalmente provienen del hecho de que los programadores no investigan mucho sobre lo que necesita la API remota para conectarse o autenticarse.
Por ejemplo, PHP reenvía las cookies desde los encabezados HTTP automáticamente, pero cuando se usa el paquete 'nodo', debe configurarse explícitamente (por ejemplo, mediante el paquete 'soap-cookie') ...
También puede utilizar wsdlrdr. EasySoap es básicamente una reescritura de wsdlrdr con algunos métodos adicionales. Tenga cuidado de que easysoap no tenga el método getNamespace que está disponible en wsdlrdr.
Respuestas:
No tienes tantas opciones.
Probablemente querrás usar uno de:
node-soap
)fuente
sudo apt-get install libexpat1-dev
Creo que una alternativa sería:
Sí, este es un enfoque bastante sucio y de bajo nivel, pero debería funcionar sin problemas.
fuente
Si
node-soap
no funciona para usted, simplemente use elnode
request
módulo y luego convierta 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 pagado, que estaba más allá de mis recursos. Entonces hice lo siguiente:curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
File > New Soap project
y subí miwsdl_file.xml
.Show Request Editor
.A partir de ahí me podría enviar una solicitud y asegurarse de que funcionaba y yo también podría utilizar el
Raw
oHTML
datos para ayudarme a crear una solicitud externa.Raw de SoapUI para mi solicitud
XML de SoapUI
Usé lo anterior para construir lo siguiente
node
request
:fuente
Me las arreglé para usar soap, wsdl y Node.js Necesitas instalar soap con
npm install soap
Cree un servidor de nodo llamado
server.js
que definirá el servicio de jabón 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).A continuación, cree un
client.js
archivo que consumirá el servicio de jabón definido porserver.js
. Este archivo proporcionará argumentos para el servicio SOAP y llamará a la URL con los puertos de servicio y los puntos finales de SOAP.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
Espero eso ayude
fuente
La forma más sencilla que encontré para enviar XML sin formato a un servicio SOAP usando Node.js es usar la implementación http de Node.js. Se parece a esto.
Habría definido la variable xml como 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 el jabón de nodos .
fuente
Dependiendo de la cantidad de puntos finales que necesite, puede ser más fácil hacerlo manualmente.
He probado 10 bibliotecas "soap nodejs" y finalmente lo hago manualmente.
fuente
Utilicé con éxito el paquete "soap" ( https://www.npmjs.com/package/soap ) en más de 10 WebApis de seguimiento (Tradetracker, Bbelboon, Affilinet, Webgains, ...).
Los problemas generalmente provienen del hecho de que los programadores no investigan mucho sobre lo que necesita la API remota para conectarse o autenticarse.
Por ejemplo, PHP reenvía las cookies desde los encabezados HTTP automáticamente, pero cuando se usa el paquete 'nodo', debe configurarse explícitamente (por ejemplo, mediante el paquete 'soap-cookie') ...
fuente
También puede consultar el easysoap npm - https://www.npmjs.org/package/easysoap -o- algunos de estos: https://nodejsmodules.org/tags/soap
https://nodejsmodules.org/pkg/express-soap2json
fuente
Usé el módulo de red de nodos para abrir un socket al servicio web.
Enviar solicitudes de jabón
Analizar la respuesta de jabón, utilicé el módulo - xml2js
Espero que ayude a alguien
fuente
Agregando a la solución de Kim .J : puede agregar
preserveWhitespace=true
para evitar un error de espacio en blanco. Me gusta esto:fuente
También puede utilizar wsdlrdr. EasySoap es básicamente una reescritura de wsdlrdr con algunos métodos adicionales. Tenga cuidado de que easysoap no tenga el método getNamespace que está disponible en wsdlrdr.
fuente
Para aquellos que son nuevos
SOAP
y desean una explicación y una guía rápidas, les recomiendo este increíble artículo mediano. .También puede utilizar el
node-soap
paquete , con este sencillo tutorial .fuente
Si solo necesita una conversión única, https://www.apimatic.io/dashboard?modal=transform le permite hacer esto creando una cuenta gratuita (sin afiliación, simplemente funcionó para mí).
Si se transforma en Swagger 2.0, puede hacer una lib js con
fuente