Всем привет.
Ситуация такая. Есть сервис, с которым надо общаться по протоколу 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)
Всем заранее спасибо.