SoapClient->__doRequest()

(no version information, might be only in CVS)

SoapClient->__doRequest() --  Performs a SOAP request

说明

class SoapClient {

string __doRequest ( string request, string location, string action, int version )

}

Performs SOAP request over HTTP.

This method can be overridden in subclasses to implement different transport layers, perform additional XML processing or other purpose.

参数

request

The XML SOAP request.

location

The URL to request.

action

The SOAP action.

action

The SOAP version.

返回值

The XML SOAP response.

范例

例子 1. 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));
?>


add a note add a note User Contributed Notes
metator at netcabo dot pt
21-Oct-2005 07:32
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.