Trying to define a webservice that will take any number of a particular complex types within a complex type using nusoap. Based on examples I have seen on the web the following should work, however the soap message being sent to the server is missing the the telephone elements.
Server:
PHP Code:
<?
/* load NuSOAP library */
require_once 'nusoap.php';
require_once 'Tools.inc';
// create server
$SoapServer = new soap_server();
// wsdl generation
$SoapServer->configureWSDL('Echo', 'http://www.revelex.com/soap', false, 'document');
$SoapServer->wsdl->schemaTargetNamespace = 'http://www.revelex.com/soap';
$SoapServer->wsdl->addComplexType('telephoneNumber',
'complexType',
'struct',
'all',
'',
array('area' => array('name' => 'area',
'type' => 'xsd:string'
),
'exchange' => array('name' => 'exchange',
'type' => 'xsd:string'
),
'number' => array('name' => 'number',
'type' => 'xsd:string'
)
)
);
$SoapServer->wsdl->addComplexType('telephoneNumbers',
'complexType',
'struct',
'sequence',
'',
array ('telephoneNumber' => array ('name' => 'telephoneNumber',
'type' => 'tns:telephoneNumber'
)
)
);
// register method
$SoapServer->register('doEcho',
array('name' => 'xsd:string',
'age' => 'xsd:int',
'telephones'=> 'tns:telephoneNumbers'
),
array('name' => 'xsd:string',
'age' => 'xsd:int',
'telephone' => 'tns:telephoneNumber'
),
'http://www.revelex.com/soap',
false,
'document',
'literal',
'Echos back the data given to it, not very useful!'
);
// method code (get DB result)
function doEcho ($name, $age, $telephones) {
if (is_string($name) and is_numeric($age)) {
// return data
//return new soap_fault('Server', '', "{$telephoneNumber[0]['area']}");
return array ('name' => $name, 'age' => $age, 'telephone' => $telephones['telephoneNumber']);
}
// we accept only a string and a int.
else {
return new soap_fault('Client', '', 'Service requires the parameters name (string), age (integer).');
}
}
// pass incoming (posted) data
$SoapServer->service($HTTP_RAW_POST_DATA)
?>
Client:
PHP Code:
<?php
require_once 'nusoap.php';
require_once 'Tools.inc';
/*ini_set('display_errors', '1');
error_reporting(E_ALL);
function my_handler($no, $str) {
echo "$no: $str <br/>";
}
set_error_handler('my_handler');
*/
$client = new soap_client('http://dev/www.revelex.com/adennis/main/tmp/soap.rvlx?wsdl', true);
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
$number[] = array('area' => '954',
'exchange' => '578',
'number' => '3220'
);
$params = array('name' => 'Alex',
'age' => 23,
'telephones' => array('telephoneNumber' => $number)
);
//Tools::printArray($params);
echo $client->_getProxyClassCode();
$proxy = $client->getProxy();
$result = $proxy->doEcho($params);
//$result = $client->call('doEcho', array('parameters' => $params));
echo '<h2>Debug</h2><pre>' . htmlspecialchars($proxy->debug_str, ENT_QUOTES) . '</pre>';
Tools::printArray($proxy->request);
Tools::printArray($proxy->response);
if ($proxy->fault) {
echo '<h2>Fault (This is expected)</h2><pre>'; print_r($result); echo '</pre>';
} else {
$err = $proxy->getError();
if ($err) {
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>';
}
}
?>
Generate Soap Request:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.revelex.com/soap"><SOAP-ENV:Body><doEcho xmlns=""><name xmlns="">Alex</name><age xmlns="">23</age><telephones xmlns=""><telephoneNumber xmlns=""></telephoneNumber></telephones></doEcho></SOAP-ENV:Body></SOAP-ENV:Envelope>