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


99

मुझे आश्चर्य है कि नोड के साथ SOAP XML वेब सेवा का उपभोग करने का सबसे अच्छा तरीका क्या है

धन्यवाद!


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

यदि आपको .NET WCF सेवा कॉल के लिए एक उदाहरण की आवश्यकता है, तो मेरा उत्तर stackoverflow.com/a/63351804/1370029
अलीकसी मनिुक

जवाबों:


83

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

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


3
धन्यवाद। नोड-साबुन स्थापित करने में समस्याएँ हो रही हैं क्योंकि नोड-एक्सपैट इंस्टॉलेशन विफलता = (
WHITECOLOR

आपको इसे बनाने के लिए एक्सपैट डेवलपमेंट हैडर्स की जरूरत पड़ेगी
रसदार स्क्रिप्सट

मुझे लगता है कि इस मुद्दे को हेडर के बारे में कहा गया है, लेकिन मुझे नहीं पता कि मुझे वह कहाँ मिलना चाहिए, जिसे मुझे संकलन के लिए रखना चाहिए, क्या आप समझा सकते हैं, कृपया?
WHITECOLOR 17

1
संभवतः आप अपने OS के लिए पैकेज प्रबंधन टूल के माध्यम से उन्हें प्राप्त कर सकते हैं। उदाहरण के लिए उबंटू परsudo apt-get install libexpat1-dev
रसदार स्क्रिप्चर

1
@RobertBroden, अपडेट के लिए धन्यवाद। अगली बार कृपया आगे बढ़ें और उत्तर को संपादित करें (या एक संपादन का सुझाव दें)!
रसदार स्क्रिपट

31

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

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

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


4
अफसोस की बात है, यह SOAP के साथ Node.js. के साथ बातचीत करने के लिए सबसे विश्वसनीय तरीका है मुझे अभी तक एक भी साबुन पुस्तकालय नहीं मिला है जो एपीआई के मुट्ठी भर साबुन के अनुरोधों का उचित उपयोग करता है।
अल्बर्टबेलबेल

1
100% गंदा है, लेकिन मुझे परिणाम के लिए लाया)))
markkillah

क्या आप सभी के साथ इनपुट xml `वास्तव में फार्म का मतलब है?
तैमेशचेव

हाँ, अभी भी पुष्टि कर सकते हैं, उपर्युक्त कामों में से कोई भी सही काम नहीं करता है।
someUser

मुझे लगता है कि "फॉर्म इनपुट xml" का मतलब सिर्फ "टेक्स्ट / xml" का एक कंटेंट-टाइप देना है
SSH This

22

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

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

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

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

मेरे अनुरोध के लिए SoapUI से कच्चा

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

मैंने निम्नलिखित बनाने के लिए ऊपर का उपयोग किया 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);

धन्यवाद @jtlindsey लेकिन मुझे 405 मेथड मिल रहे हैं जो response.statusCode, response.statusMessage के रूप में अनुमति नहीं है। किसी भी तरह से क्या आप जानते हैं कि इसे कैसे ठीक किया जाए?
सुजॉय

मेरे URL के साथ समस्या थी। मैं SOAPUI द्वारा उत्पन्न समापन बिंदु के बजाय मूल URL का उपयोग कर रहा था। उपरोक्त कोड के लिए धन्यवाद।
सुजॉय

17

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

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

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 = new Date().getFullYear();
        const n = args.weight / (args.height * args.height);
        console.log(n);
        return { bmi: n };
      }
    }
  }
};
// xml data is extracted from wsdl file created
const xml = require('fs').readFileSync('./bmicalculator.wsdl', 'utf8');
//create an express server and pass it to a soap server
const server = app.listen(3030, function() {
  const host = '127.0.0.1';
  const port = server.address().port;
});
soap.listen(server, '/bmicalculator', service, xml);

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

const express = require('express');
const soap = require('soap');
const url = 'http://localhost:3030/bmicalculator?wsdl';
const 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 फ़ाइल डेटा विनिमय के लिए एक xml आधारित प्रोटोकॉल है जो यह बताता है कि दूरस्थ वेब सेवा तक कैसे पहुँचा जाए। अपनी 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>

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


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

13

Node.js का उपयोग करके SOAP सेवा के लिए कच्चे XML भेजने का सबसे सरल तरीका मुझे Node.js 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 के रूप में परिभाषित किया होगा।

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


1
# हेल्स्टॉप, क्या आप मुझे बता सकते हैं कि नोड-सोप का उपयोग करके POST अनुरोध कैसे करें?
अभिषेक सैनी

@Abhisheksaini उपरोक्त उदाहरण एक पोस्ट है।
हाफस्टॉप

@ हेल्स्टॉप कृपया मुझे बताएं कि अनुरोध में SOAPAction कैसे शामिल किया जाए।
सोहेल

12

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

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


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

8

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

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

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


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


5

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

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

आशा है कि यह किसी की मदद करता है


1
http मॉड्यूल का उपयोग करने के बजाय आप ऐसा क्यों करेंगे?
विल मुन्न


0

आप wsdlrdr का भी उपयोग कर सकते हैं। EasySoap मूल रूप से कुछ अतिरिक्त विधियों के साथ wsdlrdr का पुनर्लेखन है। सावधान रहें कि easysoap में getNamespace विधि नहीं है जो wsdlrdr पर उपलब्ध है।


0

जो लोग नए हैं SOAPऔर एक त्वरित स्पष्टीकरण और मार्गदर्शिका चाहते हैं, मैं इस भयानक मध्यम लेख की दृढ़ता से अनुशंसा करता हूं

आप इस सरल ट्यूटोरियल के साथ, node-soap पैकेज का उपयोग भी कर सकते हैं ।


0

यदि आपको केवल एक बार रूपांतरण की आवश्यकता है, https://www.apimatic.io/dashboard?modal=transform आपको एक निःशुल्क खाता (कोई संबद्धता, यह सिर्फ मेरे लिए काम करता है) बनाकर ऐसा करने देता है।

यदि आप स्वैगर 2.0 में बदलते हैं, तो आप एक जेएस के साथ काम कर सकते हैं

$ wget https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.20/swagger-codegen-cli-3.0.20.jar \
  -O swagger-codegen-cli.jar
$ java -jar swagger-codegen-cli.jar generate \
  -l javascript -i orig.wsdl-Swagger20.json -o ./fromswagger
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.