2

This is my first run into the SOAP forest, so I have no idea what I'm doing and worse, the company has zero documentation or code examples. They at least provide an example call.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetRatesIPXML>
        <tem:ipXML>
        <![CDATA[
                <XML>
            <RateInput>
              <GUID>12345</GUID> 
              <RepID>abc</RepID> 
              <ZipCode>55343</ZipCode>
              <EffectiveDate>1/15/2014</EffectiveDate>
              <DateOfBirth >12/15/1980</DateOfBirth > 
              <FilterPlanCode></FilterPlanCode> 
            </RateInput>
          </XML>]]>
    </tem:ipXML>
      </tem:GetRatesIPXML>
   </soapenv:Body>
</soapenv:Envelope>

I've used both SoapClient and NuSoap. I've tried everything from nested arrays to objects, strings, simpleXML. I can't seem to figure this out and after two days of googling I've reached my end. Here's my current implementation.

require('lib/nusoap.php');

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new nusoap_client( self::WSDL , true);
        $soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<XML>"
            . "<RateInput>";

        $string .= "<GUID>12345</GUID>";

        $string .= "</RateInput></XML>";

        $response = $soapClient->call('GetRatesIPXML' , array('ipXML'=> $string) , '' , '', false, true);
        var_dump($soapClient->request);
        var_dump($soapClient->getError());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

It results in something close but all the < get escaped to &lt; so that doesn't work. Any help is appreciated.

edit

This is about as close as I get to the desired result

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new SoapClient( self::WSDL , array('trace' => true));
        //$soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<![CDATA[ <XML>"
            . "<RateInput>";

        $string .= "<GUID>12345</GUID>";

        $string .= "</RateInput></XML> ]]>";

        $param = new SoapVar($string, XSD_ANYXML);

        $ipXML = new stdClass();
        $ipXML->ipXML = $param;

        try
        {
            $response = $soapClient->GetRatesIPXML($ipXML);
        }
        catch(Exception $e)
        {
            var_dump($e);
        }
        var_dump($soapClient->__getLastRequest());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

I end up with

<?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:Body><ns1:GetRatesIPXML><![CDATA[ <XML><RateInput><GUID>12345</GUID></RateInput></XML> ]]></ns1:GetRatesIPXML></SOAP-ENV:Body></SOAP-ENV:Envelope>

I don't get why it's dropping the surrounding <ns1:ipXML>

edit 2

At the end of the day this worked.

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new SoapClient( self::WSDL , array('trace' => true));
        //$soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<ns1:ipXML><![CDATA[ <XML>"
            . "<RateInput>";

        $string .= "<GUID>1234</GUID> 
              <RepID>1234</RepID> 
              <ZipCode>55343</ZipCode>
              <EffectiveDate>1/15/2016</EffectiveDate>
              <DateOfBirth >07/01/1983</DateOfBirth > 
              <FilterPlanCode></FilterPlanCode>";

        $string .= "</RateInput></XML> ]]></ns1:ipXML>";

        $param = new SoapVar($string, XSD_ANYXML);

        $ipXML = new stdClass();
        $ipXML->ipXML = $param;

        try
        {
            $response = $soapClient->GetRatesIPXML($ipXML);
        }
        catch(Exception $e)
        {
            var_dump($e);
        }
        var_dump($soapClient->__getLastRequest());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

But it seems so hacky. If anyone has a better suggestion I'm open.

2
  • looks like you're viewing the output in a browser that converts < to &lt;; the output itself may be correct Commented Apr 21, 2015 at 15:32
  • It's possible, I'll look into that but I've been running this through the command line tool. Commented Apr 21, 2015 at 15:36

1 Answer 1

1

Ordinarily, XML documents are constructed (and parsed) using PHP "helper libraries" such as SimpleXML (http://php.net/manual/en/book.simplexml.php), or techniques such as the ones described here (http://www.phpeveryday.com/articles/PHP-XML-Tutorial-P848.html).

The XML document is constructed as an in-memory data structure (arrays, etc.), and then converted, in one swoop, into the XML that is to be sent.

In fact, since what you are doing is SOAP, you can go one level of abstraction above that, e.g. (http://php.net/manual/en/book.soap.php). Off-the-shelf libraries exist which will handle both the task of constructing the XML payload, and sending it, and getting server responses and decoding them. That's where you should start.

"Actum Ne Agas: Do Not Do A Thing Already Done."

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.