Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : SOAP Functions : SoapClient->__doRequest()

SoapClient->__doRequest()

Performs a SOAP request ()

Example 2272. Some examples

<?php
function Add($x,$y) {
 return
$x+$y;
}

class
LocalSoapClient extends SoapClient {

 function
__construct($wsdl, $options) {
   
parent::__construct($wsdl, $options);
   
$this->server = new SoapServer($wsdl, $options);
   
$this->server->addFunction('Add');
 }

 function
__doRequest($request, $location, $action, $version) {
   
ob_start();
   
$this->server->handle($request);
   
$response = ob_get_contents();
   
ob_end_clean();
   return
$response;
 }

}

$x = new LocalSoapClient(NULL,array('location'=>'test://',
                                 
'uri'=>'http://testuri.org'));
var_dump($x->Add(3,4));
?>

Related Examples ( Source code ) » soap_soapclient_dorequest






Code Examples / Notes » soap_soapclient_dorequest

metator

You can use this method to correct the SOAP request before sending it, if necessary. You can use the DOM API to accomplish that.
<?php
public ExtendedClient extends SoapClient {
  function __construct($wsdl, $options = null) {
     parent::__construct($wsdl, $options);
  }
  function __doRequest($request, $location, $action, $version) {
     $dom = new DOMDocument('1.0');
     try {
        //loads the SOAP request to the Document
        $dom->loadXML($request);
     } catch (DOMException $e) {
        die('Parse error with code ' . $e->code);
     }
     //create a XPath object to query the request
     $path = new DOMXPath($dom);
     //search for a node
     $nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/path/to/node');
     //check if nodes are ok
     $this->checkNodes($path, $nodesToFix);
     //save the modified SOAP request
     $request = $dom->saveXML();
     
     //doRequest
     return parent::__doRequest($request, $location, $action, $version);
  }
  function checkNodes(DOMXPath $path, DOMNodeList $nodes) {
     //iterate through the node list
     for ($i = 0; $ < $nodes->length; $i++) {
        $aNode = $nodes->item($i);
        //just an example
        if ($node->nodeValue == null) {
           //do something. For instance, let's remove it.
           $node->parentNode->removeChild($node);
        }
     }
  }
}
?>
This gives the developer the chance to solve interoperability problems with a web service.


jfitz

Note that __getLastRequest() data are buffered _before_ the call to __doRequest().  Thus any modifications you make to the XML while in __doRequest() will not be visible in the output of __getLastRequest().   This is so in at least v5.2.0

albert

If you want to communicate with a default configured ASP.NET server with SOAP 1.1 support, override your __doRequest with the following code. Adjust the namespace parameter, and all is good to go.
<?php
class MSSoapClient extends SoapClient {
function __doRequest($request, $location, $action, $version) {
$namespace = "http://tempuri.com";
$request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1);
$request = preg_replace('/<ns1:(\w+)/', '<$1', $request);
$request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);
// parent call
return parent::__doRequest($request, $location, $action, $version);
}
}
$client = new MSSoapClient(...);
?>
Hope this will save people endless hours of fiddling...


06-jul-2006 09:17

Do you have problems with the PHP5 SoapClient when you need to send a request to a service with a ComplexType parameter?

Maybe because my service is build in Delphi with REMObjects SDK 3.0 I had the problems, maybe not. Anyway, this was my remedy:
<?php
$versie = new stdClass();//define a basic class object
$versie->versieID = $aVersie->versieID();//fill it with the exact attributes as your complextype Object in the wsdl is
$versie->versieNummer = $aVersie->versieNummer();
$versie->isActief = $aVersie->isActief();      
   
$soapVersieType = new SoapVar($versie , SOAP_ENC_OBJECT, "Versie", "http://127.0.0.1:8999/SOAP?wsdl"); //create the complex soap type, Versie is the name of my complex type in the wsdl, the latter url beeing the location of my wsdl.

try{
 $result =  $soapClient->BewaarVersie($this->sessieId,$soapVersieType); //BewaarVersie is a function derived from my WSDL with two params.
}
catch(SoapFault $e){
 trigger_error('Something soapy went wrong: '.$e->faultstring,E_USER_WARNING);            }
?>

After some more testing i found out that the conversion to the StdClass() object was not required. My 'Versie' local object has the attributes for the 'Versie' wsdl complex type defined as private vars and give no pain when i create the SoapVar with an instance of the local 'Versie' Object.


Change Language


Follow Navioo On Twitter
is_soap_fault
SoapClient->__call()
SoapClient->__construct()
SoapClient->__doRequest()
SoapClient->__getFunctions()
SoapClient->__getLastRequest()
SoapClient->__getLastRequestHeaders()
SoapClient->__getLastResponse()
SoapClient->__getLastResponseHeaders()
SoapClient->__getTypes()
SoapClient->__setCookie()
SoapClient->__soapCall()
SoapFault->__construct()
SoapHeader->__construct()
SoapParam->__construct()
SoapServer->addFunction()
SoapServer->__construct()
SoapServer->fault()
SoapServer->getFunctions()
SoapServer->handle()
SoapServer->setClass()
SoapServer->setPersistence()
SoapVar->__construct()
use_soap_error_handler
eXTReMe Tracker