ما هي أفضل طريقة لاستخدام الصابون مع روبي ؟

StackOverflow https://stackoverflow.com/questions/40273

  •  09-06-2019
  •  | 
  •  

سؤال

عميل من الألغام وقد طلب مني أن دمج 3rd الطرف API في القضبان التطبيق.المشكلة الوحيدة هي أن API يستخدم الصابون.روبي قد انخفض بشكل أساسي الصابون في صالح من الراحة.أنها توفر جافا محول على ما يبدو يعمل مع جافا-روبي الجسر ، ولكن نود أن نضع كل شيء في روبي ، إذا كان ذلك ممكنا.نظرت إلى soap4r, ولكن يبدو أن قليلا من سمعة سيئة.

إذن ما هي أفضل طريقة لدمج الصابون يدعو إلى القضبان التطبيق ؟

هل كانت مفيدة؟

المحلول

كنا المدمج في soap/wsdlDriver فئة ، الذي هو في الواقع SOAP4R.إنه الكلب بطيئة, ولكن حقا بسيطة.على SOAP4R التي تحصل عليها من الأحجار الكريمة/etc هو مجرد نسخة محدثة من نفس الشيء.

رمز المثال:

require 'soap/wsdlDriver'

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

ذلك حول هذا الموضوع

نصائح أخرى

لقد بنيت سافون لجعل التفاعل مع الصابون webservices عبر روبي سهلة قدر الإمكان.
أنصح لك التحقق من ذلك.

تحولنا من هاندسواب إلى سافون.

هنا سلسلة من بلوق وظائف المقارنة بين اثنين مكتبات العميل.

وأوصى أيضا سافون.قضيت ساعات كثيرة جدا في محاولة للتعامل مع Soap4R دون نتائج.كبير عدم وجود وظائف لا doc.

سافون هو الجواب بالنسبة لي.

محاولة SOAP4R

و لقد سمعت عن هذا على القضبان الحسد بودكاست (ep 31):

فقط حصلت على أشياء العامل في غضون 3 ساعات باستخدام سافون.

الشروع الوثائق على سافون الصفحة الرئيسية كان حقا سهلة المتابعة وفعلا يقابل ما كنت أرى (ليس دائما)

كينت Sibilev من Datanoise قد استدار القضبان ActionWebService مكتبة القضبان 2.1 (وما فوق).هذا يسمح لك أن تعرض الخاصة بك روبي على أساس الصابون الخدمات.حتى أنه قد سقالة/وضع الاختبار الذي يسمح لك لاختبار الخاص بك باستخدام مستعرض.

كنت أعاني من نفس المشكلة ، تحولت إلى سافون ثم اختباره على WSDL (أنا استخدم http://www.webservicex.net/geoipservice.asmx?WSDL) و حتى الآن جيد جدا!

https://github.com/savonrb/savon

لقد استخدمت الصابون في روبي عندما كانت لدي لجعل وهمية الصابون خادم بلدي اختبارات القبول.أنا لا أعرف إذا كان هذا هو أفضل وسيلة لمعالجة المشكلة ، ولكنها عملت بالنسبة لي.

لقد استخدمت سيناترا جوهرة (كتبت عن خلق ساخرا النهاية مع سيناترا هنا) على الخادم أيضا Nokogiri لـ XML الاشياء (الصابون يعمل مع XML).

لذا في البداية يجب إنشاء اثنين من الملفات (على سبيل المثالconfig.rb و الردود.rb) التي كنت قد وضعت مسبقا الإجابات التي الصابون خادم العودة.في 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>'

في الردود.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

أتمنى أن تجد هذه مفيدة!

لقد استخدمت 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")
*/

آمل أن يساعد.الهتافات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top