আমি অবাক হই যে নোড.জেএস সহ এসওএপি এক্সএমএল ওয়েব পরিষেবা গ্রাস করার সর্বোত্তম উপায়
ধন্যবাদ!
আমি অবাক হই যে নোড.জেএস সহ এসওএপি এক্সএমএল ওয়েব পরিষেবা গ্রাস করার সর্বোত্তম উপায়
ধন্যবাদ!
উত্তর:
আপনার কাছে এতগুলি বিকল্প নেই।
আপনি সম্ভবত একটি ব্যবহার করতে চাইবেন:
node-soap
)sudo apt-get install libexpat1-dev
আমি মনে করি যে বিকল্প হতে পারে:
হ্যাঁ, এটি একটি বরং নোংরা এবং নিম্ন স্তরের পদ্ধতির তবে এটি সমস্যা ছাড়াই কাজ করা উচিত
যদি আপনার node-soap
পক্ষে কাজ না করে তবে কেবল node
request
মডিউল ব্যবহার করুন এবং তারপরে প্রয়োজনে xML কে json এ রূপান্তর করুন।
আমার অনুরোধটি কাজ করছে না 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
ডেটা ব্যবহার করতে পারি ।
আমার অনুরোধের জন্য সাপুআইআই থেকে কাঁচা
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);
আমি সাবান, ডাব্লুএসডিএল এবং নোড.জেএস ব্যবহার করতে সক্ষম হলাম আপনার সাথে সাবান ইনস্টল করা দরকার 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);
}
});
}
});
আপনার ডাব্লুএসডিএল ফাইলটি ডেটা এক্সচেঞ্জের জন্য একটি এক্সএমএল ভিত্তিক প্রোটোকল যা কোনও দূরবর্তী ওয়েব পরিষেবাতে কীভাবে অ্যাক্সেস করবেন তা নির্ধারণ করে। আপনার ডাব্লুএসডিএল ফাইল কল করুন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>
আশা করি এটা সাহায্য করবে
নোড.জেএস ব্যবহার করে কেবল একটি এসওএপি পরিষেবাতে কাঁচা এক্সএমএল প্রেরণের সর্বাধিক সহজ উপায় হ'ল নোড.জেএসপিএস 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();
আপনি স্ট্রিং আকারে কাঁচা এক্সএমএল হিসাবে এক্সএমএল ভেরিয়েবল সংজ্ঞায়িত করতে হবে।
তবে আপনি যদি কেবল নোড.জেএসের মাধ্যমে কোনও এসওএপি পরিষেবার সাথে যোগাযোগ করতে চান এবং কাঁচা এক্সএমএল প্রেরণের বিপরীতে নিয়মিত এসওএপি কল করতে চান তবে নোড.জেএস লাইব্রেরি ব্যবহার করুন। আমি নোড-সাবান পছন্দ করি ।
আপনার প্রয়োজনীয় শেষের সংখ্যাটির উপর নির্ভর করে এটি ম্যানুয়ালি করা সহজ হতে পারে।
আমি 10 লাইব্রেরি "সাবান নোডেজ" চেষ্টা করেছি আমি শেষ পর্যন্ত এটি ম্যানুয়ালি করি।
আমি 10 টিরও বেশি ট্র্যাকিং ওয়েবঅ্যাপিস (ট্রেডেট্র্যাকার, বেলবুন, অ্যাফিলিনেট, ওয়েবগেইনস, ...) এ "সাবান" প্যাকেজটি সফলভাবে ব্যবহার করেছি ( https://www.npmjs.com/package/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();
}
}
});
আশা করি এটি কাউকে সাহায্য করবে
এছাড়াও আপনি easysoap npm তাকান পারে - https://www.npmjs.org/package/easysoap -অথবা-
যোগ করা হচ্ছে কিম .J এর সমাধান : আপনি যোগ করতে পারেন preserveWhitespace=true
যাতে হোয়াইটস্পেস ত্রুটি এড়ানোর জন্য। এটার মত:
soap.CreateClient(url,preserveWhitespace=true,function(...){
আপনি wsdlrdr ব্যবহার করতে পারেন। EasySoap মূলত কিছু অতিরিক্ত পদ্ধতির সাহায্যে wsdlrdr এর পুনর্লিখন হয়। সতর্কতা অবলম্বন করুন যে ইজিলস্যাপে getNamespace পদ্ধতিটি wsdlrdr এ উপলব্ধ নেই।
যারা নতুন SOAP
এবং দ্রুত ব্যাখ্যা এবং গাইড চান তাদের জন্য , আমি দৃ strongly়ভাবে এই দুর্দান্ত মিডিয়াম নিবন্ধটি সুপারিশ করছি ।
আপনি এই সাধারণ টিউটোরিয়ালটি দিয়ে node-soap
প্যাকেজও ব্যবহার করতে পারেন ।
আপনার যদি কেবলমাত্র এককালীন রূপান্তর দরকার, https://www.apimatic.io/dashboard?modal=transfor আপনাকে একটি নিখরচায় অ্যাকাউন্ট তৈরি করে এটি করতে দেয় (কোনও সম্পর্ক নেই, এটি কেবল আমার জন্য কাজ করেছিল)।
আপনি যদি সোয়াগার ২.০ এ রূপান্তর করেন তবে আপনি একটি জেএস লাইব তৈরি করতে পারেন
$ 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