নোড.জেএস: কীভাবে এসওএপি এক্সএমএল ওয়েব পরিষেবা গ্রহণ করবেন


99

আমি অবাক হই যে নোড.জেএস সহ এসওএপি এক্সএমএল ওয়েব পরিষেবা গ্রাস করার সর্বোত্তম উপায়

ধন্যবাদ!


আপনি যদি নোড-সাবান ব্যবহার করেন এবং কীভাবে এটি ব্যবহার করবেন তা নির্ধারণ করে, আপনি কি আমাকে ডাব্লুএসডিএল তৈরি করতে সহায়তা করতে পারেন? কীভাবে জেনারেটর রয়েছে বা ডাব্লুএসডিএল কীভাবে লিখতে হবে তার একটি ভাল টিউটোরিয়াল রয়েছে। stackoverflow.com/questions/32480481/…
Andi Giga

যদি আপনি .NET WCF সেবা কলের জন্য একটি উদাহরণ প্রয়োজন, আমার উত্তর চেক stackoverflow.com/a/63351804/1370029
Aliaksei Maniuk

উত্তর:


84

আপনার কাছে এতগুলি বিকল্প নেই।

আপনি সম্ভবত একটি ব্যবহার করতে চাইবেন:


4
ধন্যবাদ নোড-সাবান ইনস্টল করতে সমস্যা হচ্ছে কারণ নোড-এক্সপ্যাট ইনস্টলেশন ব্যর্থতা = (
WHITECOLOR

এটি তৈরি করতে আপনার এক্সপ্যাট ডেভলপমেন্ট শিরোনাম প্রয়োজন হবে
রসালো স্ক্রিপ্টার

আমি বিষয়টি শিরোনাম সম্পর্কে বলেছিলাম পেয়েছি, তবে আমি জানি না যে এটি কোথায় পাওয়া উচিত যেখানে এটি সংকলন করার জন্য করা উচিত, আপনি কি ব্যাখ্যা করতে পারেন, দয়া করে?
WHITECOLOR

4
সম্ভবত আপনি আপনার ওএসের জন্য প্যাকেজ পরিচালনা সরঞ্জামের মাধ্যমে তাদের পেতে পারেন। উবুন্টুতে উদাহরণস্বরূপsudo apt-get install libexpat1-dev
রসালো স্ক্রিপ্টার

4
@ রবার্টব্রোডেন, আপডেটের জন্য ধন্যবাদ। পরবর্তী সময় এগিয়ে যান এবং উত্তর সম্পাদনা করুন (বা একটি সম্পাদনা প্রস্তাব)!
সরস স্ক্রিপ্টার

31

আমি মনে করি যে বিকল্প হতে পারে:

  • ইনপুট এবং আউটপুট এক্সএমএল বার্তাগুলি রেকর্ড করতে একটি সরঞ্জাম যেমন SoapUI ( http://www.soapui.org ) ব্যবহার করুন
  • ব্যবহারের নোড অনুরোধ ( https://github.com/mikeal/request ) ফর্ম ইনপুট XML বার্তা পাঠাতে (পোস্ট) ওয়েব পরিষেবা অনুরোধ (নোট যে এই ধরনের ejs মান জাভাস্ক্রিপ্ট টেমপ্লেট মেকানিজম ( http://embeddedjs.com / ) বা গোঁফ ( https://github.com/janl/mustache.js ) আপনাকে এখানে সহায়তা করতে পারে) এবং অবশেষে
  • জাভাস্ক্রিপ্ট অবজেক্টগুলিতে প্রতিক্রিয়া ডেটা ডিসরিয়ালাইজ করতে একটি এক্সএমএল পার্সার ব্যবহার করুন

হ্যাঁ, এটি একটি বরং নোংরা এবং নিম্ন স্তরের পদ্ধতির তবে এটি সমস্যা ছাড়াই কাজ করা উচিত


4
দুঃখের বিষয়, এই নোড.জেএস এর সাথে এসওএপি সঙ্গে যোগাযোগের জন্য সবচেয়ে নির্ভরযোগ্য পদ্ধতি আমি এখনও একটি একক সাবান লাইব্রেরি খুঁজে পেয়েছি যা আমাকে ব্যবহার করতে হবে এমন কয়েকটি মুখ্য API এর সাবান অনুরোধ করে।
অ্যালবার্টেঞ্জেলবি

4
100% নোংরা, তবে আমাকে ফলাফল এনে দিয়েছে)))
মার্ককিল্লাহ 1'15

ইনপুট এক্সএমএল গঠন করতে আপনি কী বোঝাতে চাইছেন?
টিমাসশেউ

হ্যাঁ, এখনও নিশ্চিত করতে পারেন, উপরোক্ত উল্লিখিত লিবগুলি নিখুঁতভাবে কাজ করে।
ব্যবহারকারী

আমি মনে করি "ফর্ম ইনপুট এক্সএমএল" এর অর্থ কেবল "পাঠ্য / এক্সএমএল" এর একটি সামগ্রী-ধরণ দেওয়া
এসএসএইচ

23

যদি আপনার node-soapপক্ষে কাজ না করে তবে কেবল node requestমডিউল ব্যবহার করুন এবং তারপরে প্রয়োজনে xML কে json এ রূপান্তর করুন।

আমার অনুরোধটি কাজ করছে না node-soapএবং অর্থ প্রদানের সমর্থনের বাইরে সেই মডিউলটির কোনও সমর্থন নেই, যা আমার সংস্থানগুলির বাইরে ছিল। সুতরাং আমি নিম্নলিখিতটি করেছেন:

  1. আমার লিনাক্স মেশিনে সোপুআইআই ডাউনলোড হয়েছে ।
  2. স্থানীয় ফাইলটিতে ডাব্লুএসডিএল এক্সএমএল অনুলিপি করেছেন
    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);

ধন্যবাদ @jtlindsey। তবে আমি 405 পদ্ধতিটি প্রতিক্রিয়া হিসাবে অনুমোদিত নয় getting স্ট্যাটাসকোড, রেসপন্স.স্যাটাসমেসেজ। কোনও সুযোগে আপনি কীভাবে এটি ঠিক করতে জানেন?
সুজয়

আমার ইউআরএল নিয়ে সমস্যা ছিল। আমি SOAPUI দ্বারা উত্পাদিত শেষ পয়েন্টের পরিবর্তে মূল URL ব্যবহার করছিলাম। উপরের কোডের জন্য ধন্যবাদ।
সুজয়

17

আমি সাবান, ডাব্লুএসডিএল এবং নোড.জেএস ব্যবহার করতে সক্ষম হলাম আপনার সাথে সাবান ইনস্টল করা দরকার 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>

আশা করি এটা সাহায্য করবে


4
তোমাকে অনেক ধন্যবাদ. তবে আমাকে "রেস.সেন্ড (প্রতিক্রিয়া)" অপসারণ করতে হয়েছিল; ক্লায়েন্ট থেকে এবং "` "সার্ভার ফাইলের শেষ লাইনে।
সুভাষি

13

নোড.জেএস ব্যবহার করে কেবল একটি এসওএপি পরিষেবাতে কাঁচা এক্সএমএল প্রেরণের সর্বাধিক সহজ উপায় হ'ল নোড.জেএসপিএস 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();

আপনি স্ট্রিং আকারে কাঁচা এক্সএমএল হিসাবে এক্সএমএল ভেরিয়েবল সংজ্ঞায়িত করতে হবে।

তবে আপনি যদি কেবল নোড.জেএসের মাধ্যমে কোনও এসওএপি পরিষেবার সাথে যোগাযোগ করতে চান এবং কাঁচা এক্সএমএল প্রেরণের বিপরীতে নিয়মিত এসওএপি কল করতে চান তবে নোড.জেএস লাইব্রেরি ব্যবহার করুন। আমি নোড-সাবান পছন্দ করি ।


4
# হালফস্টপ, আপনি কী আমাকে নোড-সাবান ব্যবহার করে পোষ্ট অনুরোধ করবেন তা দয়া করে বলতে পারেন?
অভিষেক সাইনি

উপরোক্ত উদাহরণটি আব্বিশেকসাইনি একটি পোস্ট।
হাফস্টপ

@ হালফস্টপ দয়া করে আমাকে অনুরোধে কীভাবে এসওএপিএक्शन অন্তর্ভুক্ত করবেন তা বলুন।
সোহেল

12

আপনার প্রয়োজনীয় শেষের সংখ্যাটির উপর নির্ভর করে এটি ম্যানুয়ালি করা সহজ হতে পারে।

আমি 10 লাইব্রেরি "সাবান নোডেজ" চেষ্টা করেছি আমি শেষ পর্যন্ত এটি ম্যানুয়ালি করি।

  • ওয়েব পরিষেবাতে অনুরোধটি প্রেরণ (POST) প্রেরণের জন্য ইনপুট এক্সএমএল বার্তা গঠনের জন্য নোড অনুরোধ ( https://github.com/mikeal/request ) ব্যবহার করুন
  • রেপ্লোনটি পার্স করার জন্য xml2j ( https://github.com/Leonidas-from-XIV/node-xML2js ) ব্যবহার করুন

আমি wsdl রুট অ্যাক্সেস করার জন্য নোড-সাবান চেষ্টা করেছিলেন কিন্তু এটা কাজ স্বল্পতা, আমি ত্রুটি পেয়ে রাখা যদিও একই জিনিস পিএইচপি কাজ করে আপনি কিভাবে আপনি এটা হয়নি আমার প্রশ্নের উত্তর দিতে পারেন stackoverflow.com/questions/39943122/...
আম্মার আজমল

8

আমি 10 টিরও বেশি ট্র্যাকিং ওয়েবঅ্যাপিস (ট্রেডেট্র্যাকার, বেলবুন, অ্যাফিলিনেট, ওয়েবগেইনস, ...) এ "সাবান" প্যাকেজটি সফলভাবে ব্যবহার করেছি ( https://www.npmjs.com/package/soap )।

সমস্যাগুলি সাধারণত এ থেকে আসে যে প্রোগ্রামাররা সংযোগ স্থাপন বা প্রমাণীকরণের জন্য দূরবর্তী এপিআইয়ের কী প্রয়োজন তা সম্পর্কে তদন্ত করে না।

উদাহরণস্বরূপ, পিএইচপি স্বয়ংক্রিয়ভাবে এইচটিটিপি শিরোনাম থেকে কুকিজ পুনরায় পাঠায়, তবে 'নোড' প্যাকেজ ব্যবহার করার সময় এটি স্পষ্টভাবে সেট করতে হবে (উদাহরণস্বরূপ 'সাবান-কুকি' প্যাকেজ দ্বারা) ...


সাবান-কুকি ব্যবহারে আমাকে নোডে থাকা একটি প্রমাণীকরণের সমস্যাটিকে বাইপাস করতে সহায়তা করেছিল, অনেক ধন্যবাদ!
নিকোলাসদাউডিন

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

আশা করি এটি কাউকে সাহায্য করবে


4
আপনি এইচডিপি মডিউল ব্যবহার না করে কেন করবেন?
মুন 16



0

আপনি wsdlrdr ব্যবহার করতে পারেন। EasySoap মূলত কিছু অতিরিক্ত পদ্ধতির সাহায্যে wsdlrdr এর পুনর্লিখন হয়। সতর্কতা অবলম্বন করুন যে ইজিলস্যাপে getNamespace পদ্ধতিটি wsdlrdr এ উপলব্ধ নেই।


0

যারা নতুন SOAPএবং দ্রুত ব্যাখ্যা এবং গাইড চান তাদের জন্য , আমি দৃ strongly়ভাবে এই দুর্দান্ত মিডিয়াম নিবন্ধটি সুপারিশ করছি ।

আপনি এই সাধারণ টিউটোরিয়ালটি দিয়ে node-soap প্যাকেজও ব্যবহার করতে পারেন ।


0

আপনার যদি কেবলমাত্র এককালীন রূপান্তর দরকার, 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.