रूबी के साथ SOAP का उपयोग करने का सबसे अच्छा तरीका क्या है?


91

मेरे एक ग्राहक ने मुझे एक 3 पार्टी एपीआई को उनके रेल ऐप में एकीकृत करने के लिए कहा है। एकमात्र समस्या यह है कि एपीआई SOAP का उपयोग करता है। रूबी ने मूल रूप से SOAP को REST के पक्ष में गिरा दिया है। वे एक जावा एडेप्टर प्रदान करते हैं जो जाहिरा तौर पर जावा-रूबी पुल के साथ काम करता है, लेकिन यदि संभव हो तो हम इसे रूबी में रखना चाहेंगे। मैंने साबुन 4r में देखा, लेकिन लगता है कि यह थोड़ा खराब है।

तो क्या सबसे अच्छा तरीका है SOAP कॉल को रेल ऐप में एकीकृत करना है?

जवाबों:


36

हमने बिल्ट इन soap/wsdlDriverक्लास का इस्तेमाल किया , जो वास्तव में SOAP4R है। यह कुत्ता धीमा है, लेकिन वास्तव में सरल है। SOAP4R जो आपको रत्नों / आदि से मिलता है, बस उसी चीज का एक अद्यतन संस्करण है।

उदाहरण कोड:

require 'soap/wsdlDriver'

client = SOAP::WSDLDriverFactory.new( 'http://example.com/service.wsdl' ).create_rpc_driver
result = client.doStuff();

यह इसके बारे में


37
"डॉग स्लो" होने का एक कारण यह है कि आप हर बार जब आप सेवा से जुड़ते हैं तो आप प्रॉक्सी का निर्माण कर रहे होते हैं। आप प्रॉक्सी को स्थायी रूप से बनाने और फिर पूर्व-निर्मित प्रॉक्सी को कॉल करने के लिए wsdl2ruby का उपयोग करके इस दर्द से बच सकते हैं।
स्टीव वीट

6
हम कर सकते हैं, लेकिन इसका मतलब है कि wsdl2ruby और इतने पर और आगे स्थापित करना होगा। कभी-कभी डॉग स्लो ठीक होता है :-)
ओरियन एडवर्ड्स

1
यदि आपको सैवोन के लिए प्रॉक्सी कक्षाएं बनाने की आवश्यकता है, तो आप विधि के नाम को पॉप्युलेट करने और कस्टम wsdl पार्सर :) का निर्माण न करने के लिए साबुन की मदद से उड़ने वाले साबुन के तरीकों के बारे में क्रेमर के दृष्टिकोण का अनुसरण कर सकते हैं । स्मृति में सभी तरीकों को संग्रहीत करने के बजाय आप फाइल करने के लिए लिख सकते हैं, खासकर यदि आपके पास टन है।
देजन

3
04/2015: Soap4r की मृत्यु हो चुकी है, वेबसाइट डाउन है। ऐसा लगता है कि सावन इस समय आम पसंद है।
पोस

मैं इस जगह में चारों ओर खुदाई कर रहा हूं और साबुन 4r-ng की खोज की, जो अभी भी बनाए रखा जा रहा है github.com/rubyjedi/soap4r
Ghoti

170

मैंने सावन को रूबी के माध्यम से SOAP webservices के साथ बातचीत करने के लिए बनाया जितना संभव हो सके।
मैं आपको इसकी जांच करने की सलाह दूंगा।


5
सैवन के लिए +1, साबुन 4r को कोसने के लिए नहीं - लेकिन मुझे इसके साथ वास्तव में बुरा अनुभव था। अच्छे प्रलेखन का अभाव और बहुत बोझिल।
konung

1
अच्छा! रूबी में SOAP दुनिया में सुधार हुआ है क्योंकि पिछली बार मुझे ऐसा करने के लिए Soap4R का उपयोग करना पड़ा था (~ 18 महीने पहले)
madlep

क्या आप में से कोई भी कृपाण का उपयोग करके कृपाण एप को हिट करने में मेरी मदद कर सकता है? मेरे पास एक कोड है, जो मुझे SOAP के wsdl का उपयोग करने के तरीके प्रदान करता है, लेकिन मैं xml प्रारूप में सेवन का उपयोग करके अनुरोध भेजने में असमर्थ हूं।
जय कुमार राजपूत


5

मैं सैवन को भी सलाह देता हूं । मैंने परिणाम के बिना, कई घंटे सोप 4 आर से निपटने की कोशिश की। कार्यक्षमता की बड़ी कमी, कोई डॉक्टर नहीं।

सावन मेरे लिए जवाब है।



3

सिर्फ 3 घंटे के भीतर मेरे सामान काम कर रहा है Savon का उपयोग कर।

सावन के मुखपृष्ठ पर आरंभ करना प्रलेखन वास्तव में पालन करना आसान था - और वास्तव में जो मैं देख रहा था उससे मेल खाता था (हमेशा मामला नहीं)


2

से केंट Sibilev Datanoise भी रेल 2.1 (और ऊपर) के लिए रेल ActionWebService पुस्तकालय मोड़ा था। यह आपको अपनी रूबी-आधारित SOAP सेवाओं को उजागर करने की अनुमति देता है। यहां तक ​​कि उसके पास एक मचान / परीक्षण मोड है जो आपको ब्राउज़र का उपयोग करके अपनी सेवाओं का परीक्षण करने की अनुमति देता है।


2

मैंने रूबी में SOAP का उपयोग किया है जब मुझे अपनी स्वीकृति परीक्षणों के लिए एक नकली SOAP सर्वर बनाना पड़ा है। मुझे नहीं पता कि यह समस्या का सबसे अच्छा तरीका है, लेकिन यह मेरे लिए काम करता है।

मैंने सिनात्रा रत्न का उपयोग किया है (मैंने सर्वर के लिए सिनात्रा के साथ मॉकिंग एंडपॉइंट बनाने के बारे में लिखा है ) और एक्सएमएल सामान के लिए नोकोगिरी भी है (एसओएपी एक्सएमएल के साथ काम कर रहा है)।

इसलिए, शुरुआत के लिए मैंने दो फाइलें बनाई हैं (जैसे config.rb और response.rb) जिसमें मैंने पूर्वनिर्धारित उत्तर दिए हैं कि SOAP सर्वर वापस आ जाएगा। में config.rb मैं WSDL फ़ाइल डाल दिया, लेकिन एक स्ट्रिंग के रूप है।

@@wsdl = '<wsdl:definitions name="StockQuote"
         targetNamespace="http://example.com/stockquote.wsdl"
         xmlns:tns="http://example.com/stockquote.wsdl"
         xmlns:xsd1="http://example.com/stockquote.xsd"
         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
         xmlns="http://schemas.xmlsoap.org/wsdl/">
         .......
      </wsdl:definitions>'

में responses.rb मैं जवाब है कि सोप सर्वर विभिन्न परिदृश्यों के लिए वापस आ जाएगी के लिए डाल नमूने की है।

@@login_failure = "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <LoginResponse xmlns="http://tempuri.org/">
            <LoginResult xmlns:a="http://schemas.datacontract.org/2004/07/WEBMethodsObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Error>Invalid username and password</a:Error>
                <a:ObjectInformation i:nil="true"/>
                <a:Response>false</a:Response>
            </LoginResult>
        </LoginResponse>
    </s:Body>
</s:Envelope>"

तो अब मैं आपको दिखाता हूं कि मैंने वास्तव में सर्वर कैसे बनाया है।

require 'sinatra'
require 'json'
require 'nokogiri'
require_relative 'config/config.rb'
require_relative 'config/responses.rb'

after do
# cors
headers({
    "Access-Control-Allow-Origin" => "*",
    "Access-Control-Allow-Methods" => "POST",
    "Access-Control-Allow-Headers" => "content-type",
})

# json
content_type :json
end

#when accessing the /HaWebMethods route the server will return either the WSDL file, either and XSD (I don't know exactly how to explain this but it is a WSDL dependency)
get "/HAWebMethods/" do
  case request.query_string
    when 'xsd=xsd0'
        status 200
        body = @@xsd0
    when 'wsdl'
        status 200
        body = @@wsdl
  end
end

post '/HAWebMethods/soap' do
request_payload = request.body.read
request_payload = Nokogiri::XML request_payload
request_payload.remove_namespaces!

if request_payload.css('Body').text != ''
    if request_payload.css('Login').text != ''
        if request_payload.css('email').text == some username && request_payload.css('password').text == some password
            status 200
            body = @@login_success
        else
            status 200
            body = @@login_failure
        end
    end
end
end

मुझे आशा है कि आपको यह मददगार लगेगा!



0

मैंने SOAP विधि को कॉल करने के लिए नीचे की तरह HTTP कॉल का उपयोग किया है,

require 'net/http'

class MyHelper
  def initialize(server, port, username, password)
    @server = server
    @port = port
    @username = username
    @password = password

    puts "Initialised My Helper using #{@server}:#{@port} username=#{@username}"
  end



  def post_job(job_name)

    puts "Posting job #{job_name} to update order service"

    job_xml ="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://test.com/Test/CreateUpdateOrders/1.0\">
    <soapenv:Header/>
    <soapenv:Body>
       <ns:CreateTestUpdateOrdersReq>
          <ContractGroup>ITE2</ContractGroup>
          <ProductID>topo</ProductID>
          <PublicationReference>#{job_name}</PublicationReference>
       </ns:CreateTestUpdateOrdersReq>
    </soapenv:Body>
 </soapenv:Envelope>"

    @http = Net::HTTP.new(@server, @port)
    puts "server: " + @server  + "port  : " + @port
    request = Net::HTTP::Post.new(('/XISOAPAdapter/MessageServlet?/Test/CreateUpdateOrders/1.0'), initheader = {'Content-Type' => 'text/xml'})
    request.basic_auth(@username, @password)
    request.body = job_xml
    response = @http.request(request)

    puts "request was made to server " + @server

    validate_response(response, "post_job_to_pega_updateorder job", '200')

  end



  private 

  def validate_response(response, operation, required_code)
    if response.code != required_code
      raise "#{operation} operation failed. Response was [#{response.inspect} #{response.to_hash.inspect} #{response.body}]"
    end
  end
end

/*
test = MyHelper.new("mysvr.test.test.com","8102","myusername","mypassword")
test.post_job("test_201601281419")
*/

आशा करता हूँ की ये काम करेगा। चीयर्स।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.