Savon: добавление кодировки к тегу body

Как добавить атрибут кодирования в тег body с помощью Savon?

Немного предыстории: я пытаюсь использовать savon для подключения к ресурсу SOAP. Я могу получить файл WSDL и просмотреть методы.

@client = Savon::Client.new("http://some.domain.com/v2messaging/service?WSDL")

когда я пытаюсь использовать метод входа

response = @client.request :service, :login do
  soap.body = { 
    "String_1" => "username",
    "String_2" => "password"
  }
end

Я получаю эту ошибку:

Ошибка / ошибка: response = @client.request:service,:login do Savon::SOAP::Fault: (env:Client) перехватил исключительную ситуацию при обработке запроса: неожиданный стиль кодировки: ожидается =http://schemas.xmlsoap.org/ мыло / кодировка /, актуально

Разница в теле тега. Вот ожидаемый xml (найденный через приложение SOAPUI):

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:service="etapestryAPI/service">
   <env:header/>
   <env:body>
      <service:login env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <String_1>username</String_1>
        <String_2>password</String_2>
      </service:login>
   </env:body>
</env:Envelope>

Савон отправляет:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:service="etapestryAPI/service" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://java.sun.com/jax-rpc-ri/internal" xmlns:ins1="etapestryAPI/service">
    <env:Body>
        <service:login>
            <String_1>username</String_1>
            <String_2>password</String_2>
        </service:login>
    </env:Body>
</env:Envelope>

Между ними есть несколько различий, но возвращаемая ошибка связана с атрибутом env:encodingStyle в теге env: login. Как можно добавить этот атрибут?

1 ответ

Решение

Я понял это. Чтобы добавить атрибут к тегу функции (в данном случае login), вы можете передать в метод дополнительный параметр:

response = @client.request :service, :login, "env:encodingStyle" => "http://schemas.xmlsoap.org/soap/encoding/" do
  soap.body = { 
           "String_1" => "username",
           "String_2" => "password"
         }
end

Это, вероятно, теперь будет работать без прохождения блока.

Другие вопросы по тегам