SOAP'u Ruby ile kullanmanın en iyi yolu nedir?


91

Bir müşterim benden bir 3. taraf API'yi Rails uygulamasına entegre etmemi istedi. Tek sorun, API'nin SOAP kullanmasıdır. Ruby temelde SOAP'ı REST lehine düşürdü. Görünüşe göre Java-Ruby köprüsü ile çalışan bir Java adaptörü sağlıyorlar, ancak mümkünse hepsini Ruby'de tutmak istiyoruz. Soap4r'e baktım ama biraz kötü bir üne sahip gibi görünüyor.

Peki SOAP çağrılarını bir Rails uygulamasına entegre etmenin en iyi yolu nedir?

Yanıtlar:


36

soap/wsdlDriverAslında SOAP4R olan yerleşik sınıfı kullandık. Yavaş, ama gerçekten basit. Gems / etc'den aldığınız SOAP4R, aynı şeyin güncellenmiş bir sürümüdür.

Örnek kod:

require 'soap/wsdlDriver'

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

Bu onunla ilgili


37
Bunun "Yavaş Köpek" olmasının nedenlerinden biri, hizmete her bağlandığınızda proxy oluşturuyor olmanızdır. Proxy'yi kalıcı olarak oluşturmak için wsdl2ruby kullanarak ve ardından önceden oluşturulmuş proxy'yi çağırarak bu acıdan kaçınabilirsiniz.
Steve Weet

7
Yapabilirdik, ama bu wsdl2ruby vb. Yüklemek anlamına gelir. Bazen Yavaş Köpek iyi :-)
Orion Edwards

1
Eğer Savon için proxy sınıfları oluşturmak gerekiyorsa, takip edebilirsiniz en kredmer on-the-fly doldurmak yöntem adlarına SoapUI yardımıyla sabun yöntemlerini bina ve özel bir wsdl ayrıştırıcı :) inşa etmek zorunda değil yaklaşımını. Tüm yöntemleri bellekte saklamak yerine, özellikle tonunuz varsa, dosyaya yazabilirsiniz.
Dejan

3
04/2015: Soap4r öldü, web sitesi kapandı. Görünüşe göre Savon şu anda ortak seçim.
Puce

Bu alanı kazıyordum ve soap4r-ng keşfettim, bu hala korunuyor github.com/rubyjedi/soap4r
Ghoti

170

Ben inşa Savon mümkün olduğunca kolaylaştırmak Ruby yoluyla SABUN webservices ile etkileşim yapmak.
Kontrol etmenizi tavsiye ederim.


5
Savon için +1, soap4r'e bash değil - ama onunla gerçekten kötü bir deneyim yaşadım. İyi dokümantasyon eksikliği ve çok külfetli.
konung

1
Güzel! Ruby'deki SOAP dünyası bunu yapmak için en son Soap4R kullanmak zorunda kaldığımdan beri gelişti (~ 18 ay önce)
madlep

Herhangi biriniz savon kullanarak saber api'yi vurmam için bana yardım edebilir mi? SABUN'un wsdl'sini kullanan yöntemleri sağlayan bir kodum var, ancak isteği xml biçiminde savon kullanarak gönderemiyorum.
Jai Kumar Rajput


5

Savon'u da tavsiye ederim . Sonuçlar olmadan Soap4R ile uğraşmak için çok fazla saat harcadım. Büyük işlevsellik eksikliği, belge yok.

Savon benim için cevap.



3

Savon kullanarak 3 saat içinde eşyalarımı çalıştırdım.

Savon'un ana sayfasındaki Başlarken belgelerini takip etmek gerçekten kolaydı ve aslında gördüklerimle eşleşiyordu (her zaman böyle değil)


2

Dan Kent Sibilev Datanoise da Raylar 2.1 (ve üstü) için Raylar ActionWebService kütüphanesini taşıdık almıştı. Bu, kendi Ruby tabanlı SOAP servislerinizi ifşa etmenize olanak sağlar. Hizmetlerinizi bir tarayıcı kullanarak test etmenize izin veren bir iskele / test moduna bile sahiptir.


2

SOAP'u Ruby'de, kabul testleri için sahte bir SOAP sunucusu yapmam gerektiğinde kullandım. Soruna yaklaşmanın en iyi yolu bu mu bilmiyorum ama benim için işe yaradı.

Sunucu için Sinatra gem ( burada Sinatra ile alaycı uç noktalar oluşturma hakkında yazdım ) ve ayrıca XML için Nokogiri (SOAP XML ile çalışıyor) kullandım.

Bu yüzden, başlangıç ​​için, SOAP sunucusunun geri döneceği önceden tanımlanmış cevapları koyduğum iki dosya (ör. Config.rb ve responses.rb) oluşturdum. Gelen config.rb Ben WSDL dosyası koymak, ama bir dize olarak var.

@@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>'

Gelen responses.rb Ben SABUN sunucusu farklı senaryolar için geri döneceği yanıtlar için koymak örnekleri var.

@@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>"

Şimdi size sunucuyu nasıl yarattığımı göstermeme izin verin.

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

Umarım bunu faydalı bulursunuz!



0

SOAP yöntemini çağırmak için aşağıdaki gibi HTTP çağrısı kullandım,

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")
*/

Umarım yardımcı olur. Şerefe.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.