No caso de você usar node-soap e descobrir como usá-lo, você poderia me ajudar a criar um wsdl. Existe um gerador ou um bom tutorial de como escrever o wsdl. stackoverflow.com/questions/32480481/…
Obrigado. tendo problemas com a instalação do node-soap porque a instalação do node-expat falhou = (
WHITECOLOR
Você precisará de cabeçalhos de desenvolvimento expat para criá-lo
Juicy Scripter
Descobri que o problema foi dito sobre os cabeçalhos, mas não sei onde devo obtê-lo, onde devo colocá-lo para compilar. Você poderia explicar, por favor?
WHITECOLOR
1
Provavelmente você pode obtê-los por meio de ferramentas de gerenciamento de pacotes para o seu sistema operacional. No Ubuntu, por exemplosudo apt-get install libexpat1-dev
Juicy Scripter
1
@RobertBroden, obrigado pela atualização. Da próxima vez, vá em frente e edite a resposta (ou sugira uma edição)!
Juicy Scripter
31
Acho que uma alternativa seria:
use uma ferramenta como SoapUI ( http://www.soapui.org ) para gravar mensagens xml de entrada e saída
Infelizmente, este é o método mais confiável para interagir com SOAP com Node.js. Ainda estou para encontrar uma única biblioteca de sabão que faça solicitações de sabão de forma adequada no punhado de APIs que tenho que usar.
AlbertEngelB
1
100% sujo, mas me trouxe resultados)))
markkillah 01 de
o que todos vocês querem dizer com formar input xml` exatamente?
timaschew
sim, posso confirmar ainda, nenhuma das bibliotecas mencionadas acima funciona perfeitamente.
someUser de
Eu acho que "Form input xml" significa apenas fornecer um Content-Type de "text / xml"
SSH Este
22
Se node-soapnão funcionar para você, basta usarnoderequest módulo e converta o xml em json se necessário.
Minha solicitação não estava funcionando node-soape não há suporte para esse módulo além do suporte pago, que estava além dos meus recursos. Então eu fiz o seguinte:
obrigado @jtlindsey. Mas estou recebendo o método 405 não permitido como response.statusCode, response.statusMessage. Por acaso você sabe como consertar isso?
Sujoy
Houve um problema com meu URL. Eu estava usando a URL original em vez do terminal gerado pelo SOAPUI. Obrigado pelo código acima.
Sujoy
17
Consegui usar sabão, wsdl e Node.js. Você precisa instalar o sabão com npm install soap
Crie um servidor de nó chamado server.jsque definirá o serviço de sabão a ser consumido por um cliente remoto. Este serviço de sabonete calcula o Índice de Massa Corporal com base no peso (kg) e na 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);
Em seguida, crie um client.jsarquivo que consumirá o serviço soap definido por server.js. Este arquivo fornecerá argumentos para o serviço soap e chamará a url com portas de serviço e terminais SOAP.
Seu arquivo wsdl é um protocolo baseado em xml para troca de dados que define como acessar um serviço da web remoto. Chame seu arquivo 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>
Muito obrigado. No entanto, tive que remover "res.send (resposta);" do cliente e "` "na última linha do arquivo do servidor.
Subhashi de
13
A maneira mais simples que descobri de apenas enviar XML bruto para um serviço SOAP usando Node.js é usar a implementação http do Node.js. Se parece com isso.
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();
Você teria definido a variável xml como o xml bruto na forma de uma string.
Mas se você deseja apenas interagir com um serviço SOAP via Node.js e fazer chamadas SOAP regulares, em vez de enviar xml bruto, use uma das bibliotecas Node.js. Eu gosto de sabão de nó .
#Halfstop, você poderia me dizer como fazer uma solicitação POST usando node-soap?
Abhishek saini
@Abhisheksaini o exemplo acima é uma postagem.
Meia parada de
@Halfstop Por favor, diga-me como incluir SOAPAction na solicitação.
Sohail,
12
Dependendo do número de terminais necessários, pode ser mais fácil fazer isso manualmente.
Eu tentei 10 bibliotecas "soap nodejs" e finalmente fiz manualmente.
use a solicitação de nó ( https://github.com/mikeal/request ) para formar uma mensagem xml de entrada para enviar (POST) a solicitação para o serviço da web
Eu tentei o node-soap para acessar a rota wsdl, mas não funciona, continuo recebendo erros embora a mesma coisa funcione no php Você pode responder minha pergunta sobre como você fez isso stackoverflow.com/questions/39943122/…
Ammar Ajmal
8
Usei com sucesso o pacote "soap" ( https://www.npmjs.com/package/soap ) em mais de 10 WebApis de rastreamento (Tradetracker, Bbelboon, Affilinet, Webgains, ...).
Os problemas geralmente vêm do fato de que os programadores não investigam muito sobre o que a API remota precisa para se conectar ou autenticar.
Por exemplo, o PHP reenvia cookies de cabeçalhos HTTP automaticamente, mas ao usar o pacote 'node', ele deve ser definido explicitamente (por exemplo, pelo pacote 'soap-cookie') ...
Você também pode usar wsdlrdr. O EasySoap é basicamente reescrever o wsdlrdr com alguns métodos extras. Tome cuidado para que o easysoap não tenha o método getNamespace, que está disponível em wsdlrdr.
Respostas:
Você não tem tantas opções.
Você provavelmente vai querer usar um dos seguintes:
node-soap
)fonte
sudo apt-get install libexpat1-dev
Acho que uma alternativa seria:
Sim, esta é uma abordagem bastante suja e de baixo nível, mas deve funcionar sem problemas
fonte
Se
node-soap
não funcionar para você, basta usarnode
request
módulo e converta o xml em json se necessário.Minha solicitação não estava funcionando
node-soap
e não há suporte para esse módulo além do suporte pago, que estava além dos meus recursos. Então eu fiz o seguinte:curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
File > New Soap project
e carreguei meuwsdl_file.xml
.Show Request Editor
.De lá, eu poderia enviar uma solicitação e verificar se funcionou e também usar o
Raw
ouHTML
dados para me ajudar a construir uma solicitação externa.Raw da SoapUI para o meu pedido
XML de SoapUI
Usei o acima para construir o seguinte
node
request
:fonte
Consegui usar sabão, wsdl e Node.js. Você precisa instalar o sabão com
npm install soap
Crie um servidor de nó chamado
server.js
que definirá o serviço de sabão a ser consumido por um cliente remoto. Este serviço de sabonete calcula o Índice de Massa Corporal com base no peso (kg) e na altura (m).Em seguida, crie um
client.js
arquivo que consumirá o serviço soap definido porserver.js
. Este arquivo fornecerá argumentos para o serviço soap e chamará a url com portas de serviço e terminais SOAP.Seu arquivo wsdl é um protocolo baseado em xml para troca de dados que define como acessar um serviço da web remoto. Chame seu arquivo wsdl
bmicalculator.wsdl
Espero que ajude
fonte
A maneira mais simples que descobri de apenas enviar XML bruto para um serviço SOAP usando Node.js é usar a implementação http do Node.js. Se parece com isso.
Você teria definido a variável xml como o xml bruto na forma de uma string.
Mas se você deseja apenas interagir com um serviço SOAP via Node.js e fazer chamadas SOAP regulares, em vez de enviar xml bruto, use uma das bibliotecas Node.js. Eu gosto de sabão de nó .
fonte
Dependendo do número de terminais necessários, pode ser mais fácil fazer isso manualmente.
Eu tentei 10 bibliotecas "soap nodejs" e finalmente fiz manualmente.
fonte
Usei com sucesso o pacote "soap" ( https://www.npmjs.com/package/soap ) em mais de 10 WebApis de rastreamento (Tradetracker, Bbelboon, Affilinet, Webgains, ...).
Os problemas geralmente vêm do fato de que os programadores não investigam muito sobre o que a API remota precisa para se conectar ou autenticar.
Por exemplo, o PHP reenvia cookies de cabeçalhos HTTP automaticamente, mas ao usar o pacote 'node', ele deve ser definido explicitamente (por exemplo, pelo pacote 'soap-cookie') ...
fonte
Você também pode consultar o npm easysoap - https://www.npmjs.org/package/easysoap -ou- alguns destes: https://nodejsmodules.org/tags/soap
https://nodejsmodules.org/pkg/express-soap2json
fonte
Usei o módulo de rede do nó para abrir um soquete para o serviço da web.
Enviar pedidos de sabonete
Analisar a resposta do soap, usei o módulo - xml2js
Espero que ajude alguém
fonte
Adicionando à solução de Kim .J : você pode adicionar
preserveWhitespace=true
para evitar um erro de espaço em branco. Como isso:fonte
Você também pode usar wsdlrdr. O EasySoap é basicamente reescrever o wsdlrdr com alguns métodos extras. Tome cuidado para que o easysoap não tenha o método getNamespace, que está disponível em wsdlrdr.
fonte
Para aqueles que são novos
SOAP
e querem uma explicação e um guia rápidos, eu recomendo fortemente este incrível artigo sobre mídia .Você também pode usar o
node-soap
pacote , com este tutorial simples .fonte
Se você precisa apenas de uma conversão única, https://www.apimatic.io/dashboard?modal=transform permite que você faça isso criando uma conta gratuita (sem afiliação, funcionou para mim).
Se você se transformar em Swagger 2.0, você pode fazer um js lib com
fonte