Soru Node.js: SOAP XML web hizmeti nasıl tüketilir


Node.js ile SOAP XML web hizmetini tüketmenin en iyi yolunun ne olduğunu merak ediyorum

Teşekkürler!


76
2017-12-28 11:22


Menşei


Eğer node-soap kullanırsanız ve onu nasıl kullanacağınızı anlarsanız, bir wsdl yaratmama yardımcı olabilir misiniz? Wsdl'in nasıl yazılacağı bir jeneratör veya iyi bir eğitici var mı? stackoverflow.com/questions/32480481/... - Andi Giga


Cevaplar:


O kadar çok seçeneğin yok.

Muhtemelen şunlardan birini kullanmak isteyeceksiniz:


67
2017-12-28 11:49



Teşekkürler. node-soap yüklemesiyle ilgili sorunlar: node-expat installation failure = - WHITECOLOR
Bunu inşa etmek için expat geliştirme başlıklarına ihtiyacınız olacak - Juicy Scripter
Sorunun üstbilgilerle ilgili söylendiğini buldum, ama nereden almam gerektiğini bilmiyorum, derlemem için nereye koymalıyım, açıklar mısınız lütfen? - WHITECOLOR
Muhtemelen, işletim sisteminiz için paket yönetim araçlarıyla alabilirsiniz. Örneğin Ubuntu'da sudo apt-get install libexpat1-dev - Juicy Scripter
faydalı olmak için güçlü sabun buldum (düğüm sabununa dayanarak). güçlü sabun bazı null parametrelerine sahip bir web hizmetini tüketerek bazı sorunlarımı ele aldı - Robert Broden


Bunun bir alternatif olacağını düşünüyorum:

Evet, bu oldukça kirli ve düşük seviye bir yaklaşımdır ancak sorunsuz çalışmalıdır.


27
2018-04-06 17:24



Ne yazık ki, bu Node.js. SOAP ile etkileşim için en güvenilir yöntemdir. Kullanmam gereken API avuç dolusu sabun taleplerini doğru şekilde yapan tek bir sabun kütüphanesi bulamadım. - Dropped.on.Caprica
% 100 kirli, ama sonuçlara getirdi))) - markkillah
xml’i tam olarak oluşturmak için ne demek istiyorsun? - timaschew
evet, hala onaylayabilir, yukarıda belirtilen libs olmayan mükemmel çalışır. - someUser
"Form girişi xml" kelimesinin "İçerik / xml" İçerik Türü sağladığını düşünüyorum. - SSH This


Node.js kullanarak ham XML'i bir SOAP hizmetine göndermek için bulduğum en basit yol Node.js http uygulamasını kullanmaktır. Buna benziyor.

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

Xml değişkenini bir dize biçiminde ham xml olarak tanımlardınız.

Ancak, sadece xml göndermenin aksine, Node.js aracılığıyla bir SOAP hizmeti ile etkileşim kurmak ve normal SOAP çağrıları yapmak istiyorsanız, Node.js kitaplıklarından birini kullanın. severim Düğüm sabun.


13
2018-05-20 18:57



#Halfstop, lütfen node-soap kullanarak POST isteğinin nasıl yapılacağını söyler misiniz? - Abhishek saini
@Abhisheksaini yukarıdaki örnektir. - Halfstop


Sabun, wsdl ve Node.js kullanmayı başardım İle sabun yüklemeniz gerekir npm install soap

Adlı bir düğüm sunucusu oluştur server.js Bu, uzak bir müşteri tarafından tüketilecek sabun servisini tanımlayacaktır. Bu sabun servisi, Vücut Kütle İndeksini ağırlık (kg) ve boy (m) bazında hesaplar.

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

Ardından, bir client.js tarafından tanımlanan sabun hizmetini tüketecek dosya server.js. Bu dosya sabun servisi için argümanlar sağlar ve SOAP servis portları ve uç noktaları ile url'yi çağırır.

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

Wsdl dosyanız, uzak bir web hizmetine nasıl erişileceğini tanımlayan veri alışverişi için xml tabanlı bir protokoldür. Wsdl dosyanızı arayın 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>

Umarım yardımcı olur


11
2018-01-24 20:02



Çok teşekkür ederim. Ancak, "res.send (response)" ı kaldırmak zorunda kaldım; istemciden ve sunucu dosyasının son satırında "` ". - Hydrogirl


İhtiyacınız olan uç nokta sayısına bağlı olarak bunu manuel olarak yapmak daha kolay olabilir.

Ben 10 kütüphane "sabun nodejs" denedim sonunda el ile yaptım.


9
2018-02-20 22:17



Wsdl yoluna erişebilmek için node-soap denedim ama işe yaramıyor, aynı şey php'de çalışıyor olsa da hata yapmaya devam ediyorum. stackoverflow.com/questions/39943122/... - Ammar Ajmal


Eğer node-soap senin için çalışmıyor, sadece kullan node  request modül ve daha sonra gerekirse xml'yi json'a dönüştürün.

İsteğimle çalışma değildi node-soap ve bu modül için ücretli desteğin ötesinde, kaynaklarımın ötesinde bir destek yoktur. Ben de şunları yaptım:

  1. İndirildi SoapUI Linux makinemde.
  2. WSDL xml'yi yerel bir dosyaya kopyaladı
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. SoapUI'de gittim File > New Soap project ve benim yükledim wsdl_file.xml.
  4. Navigator'da servislerden birini genişletip sağ tıkladım istek ve tıklandı Show Request Editor.

Oradan bir istek gönderebilir ve çalıştığından emin olabilirdim. Rawveya HTML harici bir istek oluşturmama yardımcı olacak veriler.

Benim isteği için SoapUI gelen Ham

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)

SoapUI'den 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> 

Aşağıdakileri oluşturmak için yukarıdakileri kullandım 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





"Sabun" paketini başarıyla kullandım (https://www.npmjs.com/package/soap) 10'dan fazla takip WebApis (Tradetracker, Bbelboon, Affilinet, Webgains, ...).

Sorunlar genellikle programcıların bağlanmak veya kimlik doğrulaması yapmak için uzak API'nin neye ihtiyaç duyduğu hakkında çok fazla araştırma yapmadığı gerçeğinden kaynaklanmaktadır.

Örneğin PHP, çerezleri HTTP başlıklarından otomatik olarak yeniden gönderir, ancak 'düğüm' paketini kullanırken, açık bir şekilde ayarlanmalıdır (örneğin 'sabun-kurabiyesi' paketi ile).


7
2018-04-17 16:11



sabun-kurabiye kullanarak düğümde sahip olduğum bir kimlik doğrulama problemini atlatmamı sağladı, çok teşekkürler! - nicolasdaudin


Ayrıca easysoap npm'ye de bakabilirsiniz. https://www.npmjs.org/package/easysoap -veya- bunlardan bazıları: https://nodejsmodules.org/tags/soap

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


5
2018-06-28 19:19





Web servisine bir soket açmak için düğüm net modülünü kullandım.

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

Sabun istekleri gönder

/* 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;
    }

Ayrıştırma sabun tepkisi, ben modül kullanılır - 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();
        }
    }
});

Umarım birisine yardım eder.


5
2017-11-14 10:46



http modülünü kullanmak yerine bunu neden yaptın? - Will Munn


Ekleniyor Kim .J'nin çözümü: ekleyebilirsin preserveWhitespace=true Bir Boşluk hatası önlemek için. Bunun gibi:

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

0
2018-01-10 19:36