SOAP-клиент Ruby & Savon - невозможно найти операцию SOAP

Первый раз работаю с SOAP-клиентом, поэтому не уверен, что я делаю здесь не так.

Вот API-интерфейс SOAP, который я пытаюсь использовать: 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

1 ответ

Решение

Savon 2.xx может получить доступ к веб-сервису без 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
Другие вопросы по тегам