PHP SOAP HTTP Request

13,438

Solution 1

You have a couple of options! You could use soap objects to create the request which, based upon a WSDL will know the correct way to talk to the remote server. You can see how to do this at the PHP manual.

Alternatively, you can use CURL to do the work. You'll need to know where to post the data to (which it looks like is in the example above), then you can just do something like this:

$curlData = "<?xml version="1.0" encoding="utf-8"?>... etc";
$url='http://wherever.com/service/';
$curl = curl_init();

curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl,CURLOPT_TIMEOUT,120);
curl_setopt($curl,CURLOPT_ENCODING,'gzip');

curl_setopt($curl,CURLOPT_HTTPHEADER,array (
    'SOAPAction:""',
    'Content-Type: text/xml; charset=utf-8',
));

curl_setopt ($curl, CURLOPT_POST, 1);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $curlData);

$result = curl_exec($curl);
curl_close ($curl);

You then should have the result in the $result var. You can then try to convert it to an XML doc, although sometimes I've found due to encoding this doesn't work:

$xml = new SimpleXMLElement($result);
print_r($xml);

Solution 2

As the provider of the service, the other company should supply you with a WSDL document which describes the service in computer readable terms. Typically they are provided via an url like http://their.service.url/wsdl or similar.

Once you have that you should be able to create a SoapClient instance to interact with the service.

Solution 3

Well this is definitely a SOAP request, so you'll need to use SOAP to work correctly with this or you are in for a major headache.

I've had several encounter with SOAP and PHP and everytime i had to rely on an external library. The most recent one i had to use was Zend_Soap_Client.

But then again, do you have the WSDL available? You need a WSDL to be able to use a SOAP webservice using a client library.

http://framework.zend.com/manual/en/zend.soap.html

And here is a sample of my code i used, i hope it'll get you started

ini_set('soap.wsdl_cache_enabled', 0);
set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path());
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

//Include the classes for the webservice
include('CatalogOrder.php');
include('CatalogOrderItem.php');
include('CatalogOrderWebservice.php');

//Check the mode
if(isset($_GET['wsdl'])) {

    $autodiscover = new Zend_Soap_AutoDiscover(array(
        'classmap' => array(
            'CatalogOrder' => "CatalogOrder",
            'CatalogOrderItem' => "CatalogOrderItem"
        )
    ));
    $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex());
    $autodiscover->setClass('CatalogOrderWebService');
    $autodiscover->handle();

//Return the consume form and process the actions of the consumer
} elseif(isset($_GET['consume'])) {

    // pointing to the current file here
    $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array(
        'classmap' => array(
            'CatalogOrder' => "CatalogOrder",
            'CatalogOrderItem' => "CatalogOrderItem"
        ),
        'encoding' => 'iso-8859-1'
    ));
    include('CatalogOrderWebserviceConsumer.php');

//Process SOAP requests
} else {

    // pointing to the current file here
    $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array(
        'classmap' => array(
            'CatalogOrder' => "CatalogOrder",
            'CatalogOrderItem' => "CatalogOrderItem"
        ),
        'encoding' => 'iso-8859-1'
    ));
    $soap->setClass('CatalogOrderWebService');
    $soap->handle();

}
Share:
13,438
Brett
Author by

Brett

PHP Developer

Updated on June 23, 2022

Comments

  • Brett
    Brett almost 2 years

    Despite being a PHP developer for a while, I'm just now getting my first taste of web services. I was hoping to get a little help, as the book I am using is not much help. One of the companies we are doing business with gave me an XML document in the format in needs to be in (I'll post a chunk of it). Due to my inexperience in this particular subject, I'm not really sure what to do. I need to know how to send this message to their live POST page, how to receive the response, and do I need to create any sort of WSDL page? Any help or direction would be so greatly appreciated, and please, don't just send a link to the php manual. I've obviously been there, as it is typically the go-to place for help.

    POST /sample/order.asmx HTTP/1.1
    Host: orders.sample.com
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Header>
        <AuthenticationHeader xmlns="http://sample/">
          <Username>string</Username>
          <Password>string</Password>
        </AuthenticationHeader>
        <DebugHeader xmlns="http://sample/">
          <Debug>boolean</Debug>
          <Request>string</Request>
        </DebugHeader>
      </soap12:Header>
      <soap12:Body>
        <AddOrder xmlns="http://sample/">
          <order>
            <Header>
              <ID>string</ID>
              <EntryDate>dateTime</EntryDate>
              <OrderEntryView>
                <SeqID>int</SeqID>
                <Description>string</Description>
              </OrderEntryView>
              <ReferenceNumber>string</ReferenceNumber>
              <PONumber>string</PONumber>
              <Comments>string</Comments>
              <IpAddress>string</IpAddress>
            </Header>
          </order>
        </AddOrder>
      </soap12:Body>
    </soap12:Envelope>
    

    Above is the AddOrder XML document I was given (I removed most of the body). Please let me know if anymore detail is needed, as I want to be specific as possible so I'm able to figure out how send this

  • Manas Paldhe
    Manas Paldhe about 11 years
    How do I know the $url here? Thanks.