मुझे आश्चर्य है कि नोड के साथ SOAP XML वेब सेवा का उपभोग करने का सबसे अच्छा तरीका क्या है
धन्यवाद!
मुझे आश्चर्य है कि नोड के साथ SOAP XML वेब सेवा का उपभोग करने का सबसे अच्छा तरीका क्या है
धन्यवाद!
जवाबों:
आपके पास इतने विकल्प नहीं हैं।
आप शायद इनमें से किसी एक का उपयोग करना चाहेंगे:
node-soap
)sudo apt-get install libexpat1-dev
मुझे लगता है कि एक विकल्प यह होगा:
हां, यह एक गंदा और निम्न स्तर का दृष्टिकोण है लेकिन इसे समस्याओं के बिना काम करना चाहिए
यदि node-soap
आप के लिए काम नहीं करता है, तो बस node
request
मॉड्यूल का उपयोग करें और यदि आवश्यक हो तो xml को जेन्स में परिवर्तित करें।
मेरा अनुरोध साथ काम नहीं कर रहा था node-soap
और भुगतान किए गए समर्थन से परे उस मॉड्यूल के लिए कोई समर्थन नहीं है, जो मेरे संसाधनों से परे था। तो मैंने निम्नलिखित कार्य किया:
curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
File > New Soap project
और अपना अपलोड किया wsdl_file.xml
।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);
मैं साबुन, 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>
आशा करता हूँ की ये काम करेगा
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 के रूप में परिभाषित किया होगा।
लेकिन अगर आप सिर्फ एनओडी.जेएस के माध्यम से एसओएपी सेवा के साथ बातचीत करना चाहते हैं और नियमित एसओएपी कॉल करते हैं, जैसा कि कच्ची एक्सएमएल भेजने के विपरीत, एनओडी.जेएस पुस्तकालयों में से एक का उपयोग करें। मुझे नोड-सोप पसंद है ।
आपको आवश्यक समापन बिंदुओं की संख्या के आधार पर इसे मैन्युअल रूप से करना आसान हो सकता है।
मैंने 10 पुस्तकालयों की कोशिश की है "साबुन नोडज" मैं इसे मैन्युअल रूप से करता हूं।
मैंने सफलतापूर्वक 10 से अधिक ट्रैकिंग WebApis (Tradetracker, Bbelboon, Affilinet, Webgains, ...) पर "साबुन" पैकेज ( https://www.npmjs.com/package/soap ) का उपयोग किया ।
समस्याएं आमतौर पर इस तथ्य से आती हैं कि प्रोग्रामर को कनेक्ट करने या प्रमाणित करने के लिए दूरस्थ एपीआई की आवश्यकता के बारे में बहुत अधिक जांच नहीं करता है।
उदाहरण के लिए PHP HTTP हेडर से कुकीज़ को स्वचालित रूप से रीसेट करता है, लेकिन 'नोड' पैकेज का उपयोग करते समय, इसे स्पष्ट रूप से सेट किया जाना चाहिए (उदाहरण के लिए 'साबुन-कुकी' पैकेज) ...
आप easysoap npm पर भी देख सकते हैं - https://www.npmjs.org/package/easysoap -or- इनमें से कुछ: https://nodejsmodules.org/tags/soap
मैंने वेब नेट सेवा के लिए सॉकेट खोलने के लिए नोड नेट मॉड्यूल का उपयोग किया।
/* 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();
}
}
});
आशा है कि यह किसी की मदद करता है
को जोड़ना किम जम्मू के समाधान : आप जोड़ सकते हैं preserveWhitespace=true
ताकि एक श्वेत रिक्ति त्रुटि से बचने के लिए। ऐशे ही:
soap.CreateClient(url,preserveWhitespace=true,function(...){
आप wsdlrdr का भी उपयोग कर सकते हैं। EasySoap मूल रूप से कुछ अतिरिक्त विधियों के साथ wsdlrdr का पुनर्लेखन है। सावधान रहें कि easysoap में getNamespace विधि नहीं है जो wsdlrdr पर उपलब्ध है।
जो लोग नए हैं SOAP
और एक त्वरित स्पष्टीकरण और मार्गदर्शिका चाहते हैं, मैं इस भयानक मध्यम लेख की दृढ़ता से अनुशंसा करता हूं ।
आप इस सरल ट्यूटोरियल के साथ, node-soap
पैकेज का उपयोग भी कर सकते हैं ।
यदि आपको केवल एक बार रूपांतरण की आवश्यकता है, 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