Как использовать объекты с xsi: types в Savon - PullRequest
7 голосов
/ 20 сентября 2010

Я пытаюсь использовать Savon для выполнения некоторых SOAP-запросов, но боюсь, что мне нужно немного выйти за рамки основ.

Мне нужно отправить что-то вроде:

<env:Body>
  <wsdl:methodName>
    <parameter xsi:type='ValueClass'>value</parameter>
  </wsdl:methodName>
</env:Body>

Теперь, если бы мне не нужно было указывать этот xsi: type, это было бы простым вопросом:

client.method_name { |soap| soap.body = {:parameter => 'value'} }

Проблема заключается в xsi: type в параметре;Из-за того, что используемый мной веб-сервис основан на полиморфизме, мне нужно явно указать тип этого параметра.Есть ли какой-нибудь способ, которым я могу сделать это (желательно без необходимости генерировать свой собственный XML?) Я бы очень хотел бросить soap4r навсегда:)

Спасибо!

1 Ответ

7 голосов
/ 26 сентября 2010

Указание атрибутов XML в хэше довольно уродливо, но возможно:

client.method_name do |soap|
  soap.body = {
    :parameter => 'value',
    :attributes! => { :parameter => { 'xsi:type' => ValueClass } }
  }
end

Пожалуйста, посмотрите: http://github.com/rubiii/savon/wiki/SOAP

Пока Savon не поддерживает атрибуты схемы XML, я быпредлагаем вам использовать Builder
(который поставляется с Savon) для генерации вашего XML:

client.method_name do |soap|
  xml = Builder::XmlMarkup.new
  soap.body = xml.parameter "value", "xsi:type" => "ValueClass"
end
...