Pertanyaan Node.js: cara mengkonsumsi layanan web SOAP XML


Saya ingin tahu apa cara terbaik untuk mengkonsumsi layanan web SOAP XML dengan node.js

Terima kasih!


76
2017-12-28 11:22


asal


Jawaban:


Anda tidak memiliki banyak opsi.

Anda mungkin ingin menggunakan salah satu dari:


67
2017-12-28 11:49



Saya pikir alternatifnya adalah:

Ya, ini adalah pendekatan tingkat yang agak kotor dan rendah tetapi harus bekerja tanpa masalah


27
2018-04-06 17:24



Cara paling sederhana yang saya temukan untuk hanya mengirim XML mentah ke layanan SOAP menggunakan Node.js adalah dengan menggunakan implementasi http Node.js. Terlihat seperti ini.

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

Anda akan mendefinisikan variabel xml sebagai xml mentah dalam bentuk string.

Tetapi jika Anda hanya ingin berinteraksi dengan layanan SOAP melalui Node.js dan membuat panggilan SOAP biasa, sebagai lawan mengirim xml mentah, gunakan salah satu pustaka Node.js. saya suka Node-sabun.


13
2018-05-20 18:57



Saya berhasil menggunakan sabun, wsdl dan Node.js Anda perlu menginstal sabun dengan npm install soap

Buat server simpul bernama server.js yang akan menentukan layanan sabun untuk dikonsumsi oleh klien jarak jauh. Layanan sabun ini menghitung Indeks Massa Tubuh berdasarkan berat badan (kg) dan tinggi badan (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);

Selanjutnya, buat a client.js file yang akan mengkonsumsi layanan sabun didefinisikan oleh server.js. File ini akan memberikan argumen untuk layanan sabun dan memanggil url dengan port layanan SOAP dan titik akhir.

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

File wsdl Anda adalah protokol berbasis xml untuk pertukaran data yang mendefinisikan cara mengakses layanan web jarak jauh. Panggil file wsdl Anda 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>

Semoga itu membantu


11
2018-01-24 20:02



Bergantung pada jumlah titik akhir yang Anda butuhkan, mungkin lebih mudah melakukannya secara manual.

Saya sudah mencoba 10 pustaka "soap nodejs" akhirnya saya melakukannya secara manual.


9
2018-02-20 22:17



Jika node-soap tidak berfungsi untuk Anda, cukup gunakan node  request modul dan kemudian mengkonversi xml ke json jika diperlukan.

Permintaan saya tidak berhasil node-soap dan tidak ada dukungan untuk modul itu di luar dukungan berbayar, yang berada di luar sumber daya saya. Jadi saya melakukan hal berikut:

  1. diunduh SoapUI di mesin Linux saya.
  2. menyalin xml WSDL ke file lokal
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. Di SoapUI saya pergi ke File > New Soap project dan mengunggah milik saya wsdl_file.xml.
  4. Di navigator saya memperluas salah satu layanan dan mengklik kanan permintaan dan klik Show Request Editor.

Dari sana saya bisa mengirim permintaan dan memastikan itu berhasil dan saya juga bisa menggunakan Rawatau HTML data untuk membantu saya membangun permintaan eksternal.

Mentah dari SoapUI untuk permintaan saya

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

Saya menggunakan yang di atas untuk membangun yang berikut 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



Saya berhasil menggunakan paket "sabun" (https://www.npmjs.com/package/soap) di lebih dari 10 pelacakan WebApis (Tradetracker, Bbelboon, Affilinet, Webgains, ...).

Masalah biasanya berasal dari fakta bahwa programmer tidak menyelidiki banyak tentang apa kebutuhan API remote untuk menghubungkan atau mengotentikasi.

Misalnya, PHP mengirim ulang cookie dari header HTTP secara otomatis, tetapi ketika menggunakan paket 'node', itu harus secara eksplisit disetel (misalnya dengan paket 'cookie-sabun') ...


7
2018-04-17 16:11



Anda juga dapat melihat NPM easysoap - https://www.npmjs.org/package/easysoap -atau- beberapa ini: https://nodejsmodules.org/tags/soap

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


5
2018-06-28 19:19



Saya menggunakan modul net node untuk membuka soket ke jejaring.

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

Kirim permintaan sabun

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

Pindahkan respons sabun, saya menggunakan 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();
        }
    }
});

Semoga itu membantu seseorang


5
2017-11-14 10:46



Menambah ke Solusi Kim .J: Anda dapat menambahkan preserveWhitespace=true untuk menghindari kesalahan Whitespace. Seperti ini:

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

0
2018-01-10 19:36