सवाल Node.js: SOAP XML वेब सेवा का उपभोग कैसे करें


मुझे आश्चर्य है कि एसओएपी एक्सएमएल वेब सेवा को node.js के साथ उपभोग करने का सबसे अच्छा तरीका क्या है

धन्यवाद!


76
2017-12-28 11:22


मूल


यदि आप नोड-साबुन का उपयोग करते हैं और इसका उपयोग कैसे किया जाता है, तो क्या आप मुझे wsdl बनाने में मदद कर सकते हैं। क्या कोई जनरेटर है या wsdl लिखने के लिए एक अच्छा ट्यूटोरियल है। stackoverflow.com/questions/32480481/... - Andi Giga


जवाब:


आपके पास कई विकल्प नहीं हैं।

आप शायद इनमें से एक का उपयोग करना चाहेंगे:


67
2017-12-28 11:49



धन्यवाद। नोड-साबुन स्थापित करने में समस्याएं हैं क्योंकि नोड-एक्सपैट स्थापना विफलता = ( - WHITECOLOR
इसे बनाने के लिए आपको एक्सपैट डेवलपमेंट हेडर की आवश्यकता होगी - Juicy Scripter
मुझे हेडर के बारे में यह मुद्दा बताया गया, लेकिन मुझे नहीं पता कि मुझे इसे कहां मिलना चाहिए, इसे संकलित करने के लिए कहां रखा जाना चाहिए, क्या आप समझा सकते हैं? - WHITECOLOR
शायद आप अपने ओएस के लिए पैकेज प्रबंधन उपकरण के माध्यम से प्राप्त कर सकते हैं। उदाहरण के लिए उबंटू पर sudo apt-get install libexpat1-dev - Juicy Scripter
मुझे उपयोगी साबुन मिला (नोड-साबुन के आधार पर)। मजबूत साबुन ने मेरे कुछ मुद्दों को एक वेब सेवा का उपभोग करने के साथ संबोधित किया जिसमें कुछ शून्य पैरामीटर थे - Robert Broden


मुझे लगता है कि एक विकल्प होगा:

  • सोपूआई जैसे टूल का उपयोग करें (http://www.soapui.org) इनपुट और आउटपुट एक्सएमएल संदेशों को रिकॉर्ड करने के लिए
  • नोड अनुरोध का उपयोग करें (https://github.com/mikeal/request) वेब सेवा के अनुरोध (POST) भेजने के लिए इनपुट xml संदेश बनाने के लिए (ध्यान दें कि मानक जावास्क्रिप्ट टेम्पलेटिंग तंत्र जैसे ईजेएस (http://embeddedjs.com/) या मूंछें (https://github.com/janl/mustache.js) यहां आपकी मदद कर सकता है) और अंत में
  • जावास्क्रिप्ट ऑब्जेक्ट्स को प्रतिक्रिया डेटा deserialize करने के लिए एक एक्सएमएल पार्सर का उपयोग करें

हां, यह एक बदसूरत और निम्न स्तर का दृष्टिकोण है लेकिन इसे बिना किसी समस्या के काम करना चाहिए


27
2018-04-06 17:24



अफसोस की बात है, यह SOode के साथ Node.js. के साथ बातचीत करने के लिए सबसे विश्वसनीय तरीका है। मुझे अभी तक एक ही साबुन लाइब्रेरी नहीं मिली है जो कि एपीआई के मुट्ठी भर साबुन अनुरोधों को ठीक से बनाती है। - Dropped.on.Caprica
100% गंदे, लेकिन मुझे परिणाम में लाया))) - markkillah
इनपुट xml` बनाने के लिए आप सभी का क्या मतलब है? - timaschew
हाँ, अभी भी पुष्टि कर सकते हैं, ऊपर उल्लिखित libs के गैर सही काम करता है। - someUser
मुझे लगता है कि "फॉर्म इनपुट एक्सएमएल" का अर्थ केवल "टेक्स्ट / एक्सएमएल" का एक सामग्री-प्रकार देना है - SSH This


नोड.जेएस का उपयोग करके एसओएपी सेवा में कच्चे एक्सएमएल को भेजने का सबसे आसान तरीका यह है कि नोड.जेएस http कार्यान्वयन का उपयोग करना है। यह इस तरह दिख रहा है।

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 चर को स्ट्रिंग के रूप में कच्चे xml के रूप में परिभाषित करते।

लेकिन अगर आप सिर्फ नोड.जेएस के माध्यम से एसओएपी सेवा के साथ बातचीत करना चाहते हैं और नियमित एसओएपी कॉल करते हैं, कच्चे एक्सएमएल भेजने के विरोध में, नोड.जेएस पुस्तकालयों में से एक का उपयोग करें। मुझे पसंद है नोड साबुन


13
2018-05-20 18:57



# हाफस्टॉप, क्या आप कृपया मुझे बता सकते हैं कि नोड-साबुन का उपयोग करके POST अनुरोध कैसे करें? - Abhishek saini
उपरोक्त उदाहरण @ अभिषेकसेनी एक पोस्ट है। - Halfstop


मैं साबुन, wsdl और Node.js का उपयोग करने में कामयाब रहे आपको साबुन स्थापित करने की आवश्यकता है npm install soap

नामक एक नोड सर्वर बनाएँ server.js जो रिमोट क्लाइंट द्वारा साबित होने वाली साबुन सेवा को परिभाषित करेगा। यह साबुन सेवा वजन (किलो) और ऊंचाई (एम) के आधार पर बॉडी मास इंडेक्स की गणना करती है।

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

अगला, एक बनाएँ client.js फ़ाइल जो परिभाषित साबुन सेवा का उपभोग करेगी server.js। यह फ़ाइल साबुन सेवा के लिए तर्क प्रदान करेगी और एसओएपी के सेवा बंदरगाहों और अंतराल के साथ यूआरएल को कॉल करेगी।

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 फ़ाइल डेटा एक्सचेंज के लिए एक एक्सएमएल आधारित प्रोटोकॉल है जो परिभाषित करता है कि दूरस्थ वेब सेवा का उपयोग कैसे करें। अपनी 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>

आशा करता हूँ की ये काम करेगा


11
2018-01-24 20:02



बहुत बहुत धन्यवाद। हालांकि, मुझे "res.send (प्रतिक्रिया) को हटाना पड़ा;" सर्वर से और सर्वर फ़ाइल की अंतिम पंक्ति पर "` "। - Hydrogirl


आपको आवश्यक अंतराल की संख्या के आधार पर इसे मैन्युअल रूप से करना आसान हो सकता है।

मैंने 10 पुस्तकालयों "साबुन नोडजेज़" की कोशिश की है, अंततः मैं इसे मैन्युअल रूप से करता हूं।

  • नोड अनुरोध का उपयोग करें (https://github.com/mikeal/request) वेब सेवा के अनुरोध (POST) भेजने के लिए इनपुट xml संदेश बनाने के लिए
  • xml2j का उपयोग करें ( https://github.com/Leonidas-from-XIV/node-xml2js ) प्रतिक्रिया का विश्लेषण करने के लिए

9
2018-02-20 22:17



मैंने wsdl मार्ग तक पहुंचने के लिए नोड-साबुन की कोशिश की लेकिन यह काम नहीं करता है, मुझे त्रुटि मिल रही है हालांकि वही बात php में काम करती है क्या आप मेरे प्रश्न का उत्तर दे सकते हैं कि आपने यह कैसे किया stackoverflow.com/questions/39943122/... - Ammar Ajmal


अगर node-soap आपके लिए काम नहीं करता है, बस उपयोग करें node  request मॉड्यूल और फिर आवश्यक होने पर एक्सएमएल को जेसन में परिवर्तित करें।

मेरा अनुरोध काम नहीं कर रहा था node-soap और उस मॉड्यूल के लिए भुगतान समर्थन से परे कोई समर्थन नहीं है, जो मेरे संसाधनों से परे था। तो मैंने निम्नलिखित किया:

  1. डाउनलोड किया SoapUI मेरी लिनक्स मशीन पर।
  2. WSDL xml को स्थानीय फ़ाइल में कॉपी किया गया
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. सोपूआई में मैं गया था File > New Soap project और मेरा अपलोड किया wsdl_file.xml
  4. नेविगेटर में मैंने सेवाओं में से एक का विस्तार किया और दायाँ क्लिक किया अनुरोध और क्लिक किया Show Request Editor

वहां से मैं एक अनुरोध भेज सकता था और यह सुनिश्चित कर सकता था कि यह काम करता है और मैं इसका भी उपयोग कर सकता हूं Rawया HTML बाहरी अनुरोध बनाने में मेरी सहायता करने के लिए डेटा।

मेरे अनुरोध के लिए सोपूआई से कच्चा

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)

सोपूआई से एक्सएमएल

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

मैंने उपरोक्त का निर्माण निम्नलिखित करने के लिए किया था 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





मैंने सफलतापूर्वक "साबुन" पैकेज का उपयोग किया (https://www.npmjs.com/package/soap) 10 से अधिक ट्रैकिंग वेबएपिस (ट्रेडेटर, बेबेलबोन, एफ़िलिनेट, वेबगेन्स, ...) पर।

आमतौर पर समस्याएं इस तथ्य से आती हैं कि प्रोग्रामर कनेक्ट या प्रमाणीकृत करने के लिए दूरस्थ API की आवश्यकता के बारे में बहुत अधिक जांच नहीं करता है।

उदाहरण के लिए PHP स्वचालित रूप से HTTP शीर्षलेख से कुकीज़ भेजता है, लेकिन 'नोड' पैकेज का उपयोग करते समय, इसे स्पष्ट रूप से सेट करना होगा (उदाहरण के लिए 'साबुन-कुकी' पैकेज द्वारा) ...


7
2018-04-17 16:11



साबुन-कुकी का उपयोग करने से मुझे नोड में होने वाली प्रमाणीकरण समस्या को बाईपास करने में मदद मिली, बहुत बहुत धन्यवाद! - nicolasdaudin


आप easysoap एनपीएम भी देख सकते हैं - https://www.npmjs.org/package/easysoap -या- इनमें से कुछ: https://nodejsmodules.org/tags/soap

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


5
2018-06-28 19:19





मैंने webservice पर सॉकेट खोलने के लिए नोड नेट मॉड्यूल का उपयोग किया।

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

साबुन अनुरोध भेजें

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

पार्स साबुन प्रतिक्रिया, मैं मॉड्यूल का उपयोग किया - 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();
        }
    }
});

उम्मीद है कि यह किसी की मदद करता है


5
2017-11-14 10:46



http मॉड्यूल का उपयोग करने के बजाय आप ऐसा क्यों करेंगे? - Will Munn


में जोड़ना किम। जे का समाधान: आप जोड़ सकते हो preserveWhitespace=true एक व्हाइटस्पेस त्रुटि से बचने के लिए। इस कदर:

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

0
2018-01-10 19:36