@Fly3110
web developer

Почему Savon создает неверный xml?

Всем привет.

Ситуация такая. Есть сервис, с которым надо общаться по протоколу SOAP.
PHP скрипт работает верно. Когда посылаю запрос из руби, то он не принимается сервером.
Сделал дамп обоих xml, которые посылаются.

PHP:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:ServiceName" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns1:soap_function>
            <params xsi:type="ns1:RequestType">
                ... список параметров
            </params>
        </ns1:soap_function>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Ruby (Savon):
<?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:typens="urn:ServiceName" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <typens:soap_function>
        ... список параметров
    </typens:soap_function>
  </env:Body>
</env:Envelope>


Как видно, в PHP список параметров обернут еще в один тег, params. Savon этого не делает.
Если в коде, при вызове SOAP функции, руками обернуть параметры, то все работает верно.
То есть сделать не
client.call(:soap_function, message: params)
a
client.call(:soap_function, message: {params: params})


В данном случае у меня был рабочий пример перед глазами. А если бы не было? Лезть в wsdl? Надеюсь, что это я просто как-то не так создал клиента в savon. Или, возможно, уже надо использовать другой гем? :)

Клиента создаю вот так:
client = Savon.client(
        wsdl:             WSDL,
        ssl_verify_mode:  :none,
        pretty_print_xml: true,
        log_level:        :debug,
        raise_errors:     true,
        logger:           Rails.logger,
        log:              true)


Всем заранее спасибо.
  • Вопрос задан
  • 481 просмотр
Пригласить эксперта
Ответы на вопрос 2
@j_wayne
Savon - очень неплохой SOAP-гем. Я думаю, вам лучше всего создать issue в репозитории savon. Там объяснят, фича это или баг.
Ответ написан
Комментировать
Jeiwan
@Jeiwan
client.call(:soap_function, message: params) – а почему он должен оборачивать в тег params? Он преобразует хеш в XML — какой хеш передадите, такие XML-теги и получите
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы