Как перейти с SOAP: RPC: Driver на Savon

Как обсуждалось в другом месте SOAP::RPC::Driver, который был доступен в Ruby 1.8, был удален в Ruby 1.9. Люди предложили использовать Savon gem, но я не могу найти никаких руководств по преобразованию существующего кода, особенно для конечных точек, для которых нет доступного WSDL.

Например, с SOAP::RPC::Driver мы могли бы написать:

require 'soap/rpc/driver'
client = SOAP::RPC::Driver.new 'http://example.com/endpoint', 'MY_NAMESPACE'

Добавьте методы (поскольку в моем случае у меня нет доступного WSDL):

client.add_method 'MyMethod', 'Arg1', 'Arg2'

А потом позвоните им:

response = client.MyMethod arg_one arg_two

Я не понимаю, как добавить такие методы в Савон.


person davetapley    schedule 12.07.2012    source источник


Ответы (1)


Когда не используется WSDL, нужно явно настроить wsdl (я нахожу это немного нелогично, но работает):

require 'savon'
client = Savon::Client.new do
    wsdl.endpoint = 'http://example.com/endpoint'
    wsdl.namespace = 'MY_NAMESPACE'; 
end

Я не верю, что в Савоне есть эквивалент add_method, но тогда вы сможете сделать запрос таким образом:

response = client.request 'MyMethod' do
  soap.body = { 'Arg1' => arg_one' }
end

Однако когда я это сделал, я получил следующую ошибку:

Savon::SOAP::Fault: (SOAP-ENV:Client) SOAPAction shall match 'uri#method' if present 

Мне удалось обойти это, явно установив SOAPAction:

response = client.request 'MyMethod', soap_action: '#MyMethod' do ...

Наконец я получил эту ошибку:

Savon::SOAP::Fault: (SOAP-ENV:Client) Denied access to method (MyMethod) in class (main) at /usr/lib/perl5/site_perl/5.8.8/SOAP/Lite.pm line 2128.

Похоже, это связано с тем, что данный wsdl.namespace не передается, как ожидалось, с запросом. Я смог решить эту проблему, явно установив его как в soap_action, так и в xmlns:

response = client.request 'MyMethod', soap_action: 'MY_NAMESPACE#MyMethod', xmlns: 'MY_NAMESPACE'
person davetapley    schedule 12.07.2012