2013-08-24 4 views
0

Впервые работает с клиентом SOAP, поэтому не уверен, что я здесь делаю неправильно.Клиент SOAP-клиента Ruby & Savon - Не удается найти операцию SOAP

Вот SOAP API Я пытаюсь не использовать: http://services.carsolize.com/BookingServices/DynamicDataService.svc?wsdl

irb(main):018:0> client = Savon.client(wsdl: "http://services.carsolize.com/BookingServices/DynamicDataService.svc?wsdl", convert_request_keys_to: :camelcase) 

Независимо от того, что я перехожу к call на client, он говорит мне:

irb(main):022:0> client.call :service_request, :message => {} 
HTTPI GET request to services.carsolize.com (net_http) 
Savon::UnknownOperationError: Unable to find SOAP operation: :service_request 
Operations provided by your service: [] 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/operation.rb:22:in `ensure_exists!' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/operation.rb:14:in `create' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/client.rb:32:in `operation' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/client.rb:36:in `call' 
    from (irb):22 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start' 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start' 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

Я понимаю, что сервис SOAP не сообщает о каких-либо операциях. Есть ли способ обойти это? Это что-то на моей стороне, это беспорядок, или это веб-сервис?

Савон версия: 2.2.0

+2

Лучший способ исследовать вашу службу - использовать SoapUI и создавать вызовы, которые работают. Следующим шагом будет написать клиент в Ruby/Savon, который создает тот же запрос. –

ответ

3

Савон 2.x.x может получить доступ к веб-службы без WSDL. Я проверил WSDL, который вы предоставили с помощью SoapUI, и использовал вывод для создания следующего кода.

Это не работает, потому что у меня явно нет правильных учетных данных, но он должен дать вам представление о том, где продолжить.

#!ruby 
# 
gem 'savon', '~> 2.0' 
require 'savon' 

client = Savon.client(
    endpoint: 'http://services.carsolize.com/BookingServices/DynamicDataService.svc', 
    soap_action: "http://tempuri.org/IDynamicDataService/ServiceRequest", 
    namespace: 'http://tempuri.org/', 
    convert_request_keys_to: :camelcase, 
    env_namespace: :soapenv, 
    namespace_identifier: :tem, 
    log: true, 
    log_level: :debug, 
    pretty_print_xml: true 
) 

response = client.call(:service_request, 
         message: { 
          'tem:rqst' => { 
          'BookAsUser' => 'nobody', 
          'Credentials' => { 
           'Password' => 'super secret', 
           'UserName' => 'JoeSixpack' 
          }, 
          'Request' => { 
           'ClientIP' => '192.168.142.857' 
          }, 
          'RequestType' => 'reservation', 
          'SessionID' => 'AAAAAAAAAAAAAABBBBBBBBBBBBB', 
          'TypeOfService' => 'speedy' 
          } 
         } 
        ) 
p response.to_hash 
+0

Удивительно, я попробую это завтра и отчитаю. Спасибо! – RFC1337

+0

Вот что я получил, когда попробовал этот код (с действительными учетными данными) 'Savon :: SOAPFault: (a: ActionNotSupported) Сообщение с действием« ServiceRequest »не может быть обработано в приемнике из-за несоответствия C ontractFilter на EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несогласованные действия между s ender и получателем), либо несоответствие привязки/безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют один и тот же контракт и одну и ту же привязку (включая требования безопасности, например сообщение, транспорт, нет). – RFC1337

+0

Здесь мы снова говорим: я нашел орфографическую ошибку в определении пространства имен. Я также нашел, что с помощью SoapUI существует пользовательское SOAPAction. Я отредактировал источник в своем ответе соответственно. Теперь я все еще получаю сообщение об ошибке, потому что мой Fantasy RequestType неизвестен. Надеюсь, у вас будет описание сервиса и вы знаете, что добавить? –

Смежные вопросы