ما هي أفضل طريقة لاستخدام الصابون مع روبي ؟
-
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) و حتى الآن جيد جدا!
لقد استخدمت الصابون في روبي عندما كانت لدي لجعل وهمية الصابون خادم بلدي اختبارات القبول.أنا لا أعرف إذا كان هذا هو أفضل وسيلة لمعالجة المشكلة ، ولكنها عملت بالنسبة لي.
لقد استخدمت سيناترا جوهرة (كتبت عن خلق ساخرا النهاية مع سيناترا هنا) على الخادم أيضا 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")
*/
آمل أن يساعد.الهتافات.