Как лучше всего использовать мыло с Рубином?
мой клиент попросил меня интегрировать сторонний API в свое приложение Rails. Единственная проблема заключается в том, что API использует SOAP. Рубин в основном бросил мыло в пользу отдыха. Они предоставляют адаптер Java, который, по-видимому, работает с мостом Java-Ruby, но мы хотели бы сохранить все это в Ruby, если это возможно. Я заглянул в soap4r, но, похоже, у него немного плохая репутация.
Итак, каков наилучший способ интеграции вызовов SOAP в приложение Rails?
10 ответов:
мы использовали встроенный
soap/wsdlDriver
класс, который на самом деле SOAP4R. Это собака медленно, но очень просто. SOAP4R, который вы получаете от gems / etc-это просто обновленная версия того же самого.пример кода:
require 'soap/wsdlDriver' client = SOAP::WSDLDriverFactory.new( 'http://example.com/service.wsdl' ).create_rpc_driver result = client.doStuff();
вот и все
Я построил Savon чтобы максимально упростить взаимодействие с веб-сервисами SOAP через Ruby.
Я бы рекомендовал вам проверить это.
мы перешли от мытья рук до Савон.
здесь серия сообщений в блоге сравнение двух клиентских библиотек.
и Savon. Я потратил слишком много часов, пытаясь справиться с Soap4R, безрезультатно. Большой недостаток функциональности, нет док.
Савон-это ответ для меня.
просто получил мои вещи работают в течение 3 часов с помощью Savon.
начало работы документации на домашней странице Савона было очень легко следовать - и на самом деле соответствует тому, что я видел (не всегда так)
Кент Сибилев из Datanoise также портировал библиотеку Rails ActionWebService на Rails 2.1 (и выше). Это позволяет предоставлять собственные службы SOAP на основе Ruby. У него даже есть режим scaffold / test, который позволяет вам тестировать свои услуги с помощью браузера.
Я использовал мыло в Ruby, когда мне пришлось сделать поддельный сервер SOAP для моих приемочных тестов. Я не знаю, был ли это лучший способ подойти к проблеме, но это сработало для меня.
Я использовал Sinatra gem (я писал о создании насмешливых конечных точек с Sinatra здесь) для сервера, а также Nokogiri для XML-материала (SOAP работает с XML).
Итак, для начала я должен создать два файла (например, config.РБ и ответы.РБ), в котором Я поставил предопределенные ответы, которые вернет SOAP-сервер. В config.РБ я поставил файл 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>'
на ответы.РБ я поставил образцы для ответов, которые SOAP-сервер вернет для разных сценариев.
@@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
Я надеюсь, вы найдете это полезным!
У меня была та же проблема, переключился на Savon, а затем просто протестировал его на открытом WSDL (я использовал http://www.webservicex.net/geoipservice.asmx?WSDL) и до сих пор так хорошо!
Я использовал HTTP-вызов, как показано ниже, чтобы вызвать метод SOAP,
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") */
надеюсь, что это помогает. Овации.