0

I am trying to communicate with a 3-rd party API. I tried both savon and Soap UI but both failed, then I asked them and they gave me equivalent that works. Confused, I toggled the logger and got following XML request which is quite different from what Savon is sending. Here is the PHP code (I guess that's not needed, but still)

$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);

Here is the XML request that PHP is sending and which is working just fine

<?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>

Here is my ruby code so far

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)

Here is what Savon is producing

<?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>

I don't know how to make it equivalent to the PHP one. Am I missing something obvious ?

I tried to look at Savon documentation to find if there are some methods to manipulate tags with fine grain control but couldn't find much about it.

Questions similar to this are either unanswered or are specific to the requests.

Some SO questions that helped a little

Little curious, how PHP gets it right most of the time. Is it the parser they use for wsdl?

Community
  • 1
  • 1
  • does this help? http://stackoverflow.com/questions/21913449/sending-raw-xml-using-savon-2 – max pleaner Oct 29 '16 at 17:37
  • @maxpleaner Hi, this would only help for making requests.I mean I would have to run PHP code for every service and retreive xml and then send it using Savon or any other client. Is there any way to know which parameter to tweak to get xml like the PHP one ? I have found many open issues related to that on Savon's github repo :( – Jatin Dhankhar Oct 30 '16 at 08:06
  • I don't see the difference between what your PHP example produces and what the Ruby/Savon examples does. Perhaps you reformat your code parts and make it clearer in your question. – Steffen Roller Oct 30 '16 at 16:20

0 Answers0