|
|
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.
version
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
User Contributed Notes
SoapClient->__doRequest()
albert at jool dot nl
26-Mar-2007 07:28
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);
return parent::__doRequest($request, $location, $action, $version);
}
}
$client = new MSSoapClient(...);
?>
Hope this will save people endless hours of fiddling...
jfitz at spacelink dot com
05-Dec-2006 09:56
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
06-Jul-2006 01: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();$versie->versieID = $aVersie->versieID();$versie->versieNummer = $aVersie->versieNummer();
$versie->isActief = $aVersie->isActief();
$soapVersieType = new SoapVar($versie , SOAP_ENC_OBJECT, "Versie", "http://127.0.0.1:8999/SOAP?wsdl"); try{
$result = $soapClient->BewaarVersie($this->sessieId,$soapVersieType); }
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.
metator at netcabo dot pt
20-Oct-2005 04: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 {
$dom->loadXML($request);
} catch (DOMException $e) {
die('Parse error with code ' . $e->code);
}
$path = new DOMXPath($dom);
$nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/path/to/node');
$this->checkNodes($path, $nodesToFix);
$request = $dom->saveXML();
return parent::__doRequest($request, $location, $action, $version);
}
function checkNodes(DOMXPath $path, DOMNodeList $nodes) {
for ($i = 0; $ < $nodes->length; $i++) {
$aNode = $nodes->item($i);
if ($node->nodeValue == null) {
$node->parentNode->removeChild($node);
}
}
}
}
?>
This gives the developer the chance to solve interoperability problems with a web service.
|