Я пытаюсь связаться с сторонним API. Я попробовал и savon, и Soap UI, но оба не удалось, затем я спросил их, и они дали мне эквивалент, который работает. В замешательстве я переключил регистратор и получил следующий XML-запрос, который сильно отличается от того, что посылает Савон.
Вот код PHP (я думаю, что он не нужен, но все же)
$apiauth =array('UserName'=>'XXXXXX','Password'=>'XXXXXXX','ClientCode'=>'1234')
$wsdl = 'http://stagewebapi.mylescars.com/service.asmx?wsdl';
$soap = new SoapClient($wsdl);
$header = new SoapHeader('http://tempuri.org/', 'AuthHeader', $apiauth);
$soap->__setSoapHeaders($header);
$data = $soap->fetchCities($header);
print_r($data);
Вот XML-запрос, который отправляет PHP и который работает просто отлично
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Header><ns1:AuthHeader><ns1:UserName>XXXXXXX</ns1:UserName><ns1:Password>XXXXXXX</ns1:Password><ns1:ClientCode>1234</ns1:ClientCode></ns1:AuthHeader></SOAP-ENV:Header><SOAP-ENV:Body><ns1:fetchCities/></SOAP-ENV:Body></SOAP-ENV:Envelope>
Вот мой рубиновый код
require 'savon'
auth_header = { 'UserName'=>'XXXXXXX','Password'=>'XXXXXXXX','ClientCode'=>'1234'}
client = Savon.client(:wsdl => "http://stagewebapi.mylescars.com/service.asmx?wsdl",
:namespace_identifier => :ns1 ,:namespace => "http://tempuri.org/" , :log => true, :soap_header => auth_header,
:pretty_print_xml => true, :env_namespace => 'SOAP-ENV')puts client.call(:fetch_cities)
Вот что производит Savon
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://tempuri.org/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
<UserName>XXXXXXXXXXXXXXX</UserName>
<Password>XXXXXXXXXXXXX</Password>
<ClientCode>2873</ClientCode>
</soap-env:Header>
<soap-env:Body>
<ns1:fetchCities/>
</soap-env:Body>
</soap-env:Envelope>
Я не знаю, как сделать его эквивалентным PHP. Я что-то упускаю из виду?
Я попытался просмотреть документацию Savon, чтобы найти, есть ли какие-то методы для манипулирования тегами с точным контролем зерна, но не смог найти много об этом.
Подобные вопросы либо остаются без ответа, либо относятся к конкретным запросам.
Некоторые ТАК вопросы, которые немного помогли
Немного любопытно, как PHP делает это правильно большую часть времени. Это парсер, который они используют для WSDL?
Задача ещё не решена.
Других решений пока нет …