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