Seems pretty logical once you find the solution, but it took me quite a while to figure this one out:
If you are using WSDL based SOAP requests and you have more than one operation in your binding (with the same parameters), make sure the <soap:operation> style is set to rpc, NOT body!
When you specify 'body' here, all that will be transmitted in the request is the parameters for the function call, and SoapServer->handle() will use the first function it finds with the same parameter-makeup to handle the call.
ie If you have 2 functions:
<?php
function One ( string $blah );
function Two ( string $blah );
?>
Making a client call with SoapClient -> Two ( 'test' ); will result in One ( ) being called when your 'type' is set to 'body'
The actual method to call will only be included in the request when your type is set to 'rpc', resulting in the expected behavior
SoapServer->handle()
(No version information available, might be only in CVS)
SoapServer->handle() — Gère une requête SOAP
Description
SoapServer
void handle
([ string $soap_request
] )
Effectue une requête SOAP, appelle les fonctions nécessaire et envoie une réponse en retour.
Liste de paramètres
- soap_request
-
La requête SOAP. Si cet argument est omis, la requête est supposée être dans la variable PHP $HTTP_RAW_POST_DATA.
Valeurs de retour
Aucune valeur n'est retournée.
Exemples
Exemple #1 Quelques exemples
<?php
function test($x)
{
return $x;
}
$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>
SoapServer->handle()
Blizzke at gmail dot com
12-Mar-2008 05:39
12-Mar-2008 05:39
king dot maxemilian at noos dot fr
21-Aug-2007 09:23
21-Aug-2007 09:23
Sometime, it happens that PHP does not detect anything in $HTTP_RAW_POST_DATA.
To solve this problem and make it work in any case:
function soaputils_autoFindSoapRequest() {
global $HTTP_RAW_POST_DATA;
if($HTTP_RAW_POST_DATA)
return $HTTP_RAW_POST_DATA;
$f = file("php://input");
return implode(" ", $f);
}
$server = new SoapServer($wsdl);
$server->setClass($MyClass);
$server->handle(soaputils_autoFindSoapRequest());
