NuSOAP返回空数组

I have the problem, that the NuSOAP server returns an empty array. I read and tried a lot of topics/things already but the result is always the same. I guess its only a minor thing you guys can solve within a minute.

I want to put an array of strings containing client information into another array that holds all servers:

    Array
    (
       [Client1] => Array ([HostName] => 'TestHostName', [IP] => '1.1.1.1'),
       [Client2] => Array ([HostName] => 'TestHostName', [IP] => '2.2.2.2'),
       [Client3] => Array ([HostName] => 'TestHostName', [IP] => '3.3.3.3')
    )

The arrays will get filled from mysql data, but for testing purposes I created a static array with data. Here is what I have got so far:

<?php
require_once ('lib/nusoap.php');
require('mysql.php');

$ServerName = 'server';
$ServiceName = 'CentralConfigService';
$ServiceURL = 'http://' . $ServerName . '/' . $ServiceName;

$Server = new soap_server();
$Server -> configureWSDL($ServiceName, $ServerName . '/' . $ServiceName);

function GetClientInfo($ClientName)
{
        $Clients = array();
        $ClientInfo = array(
                        'HostName' => 'testiname',
                        'IP' => 'testip',
                        'Type' => 'testtype',
                        'Config' => 'testconfig',
                        'Routines' => 'testroutines',
                        'Files' => 'testfiles',
                        'Access' => 'testaccess');
        $Clients[$ClientName] = $ClientInfo;
        return $Clients;
}


$Server -> wsdl -> addComplexType(
        'ClientInfo',
        'complexType',
        'struct',
        'sequence',
        '',
        array(
                'HostName' => array('name' => 'HostName', 'type' => 'xsd:string'),
                'IP' => array('name' => 'IP', 'type' => 'xsd:string'),
                'Type' => array('name' => 'Type', 'type' => 'xsd:string'),
                'Config' => array('name' => 'Config', 'type' => 'xsd:string'),
                'Routines' => array('name' => 'Routines', 'type' => 'xsd:string'),
                'Files' => array('name' => 'Files', 'type' => 'xsd:string'),
                'Access' => array('name' => 'Access', 'type' => 'xsd:string')
        )
);


$Server -> wsdl -> addComplexType(
        'Clients',
        'complexType',
        'array',
        '',
        'SOAP-ENC:Array',
        array(),
        array(
                array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:ClientInfo')
        ),
        'tns:Clients'
);


$Server -> register(
        'GetClientInfo',
        array('HostName' => 'xsd:string'),
        array('return' => 'tns:Clients'),
        $ServiceURL,
        $ServiceURL . '#GetClientInfo',
        'rpc',
        'encoded',
        'Get config by type');



if ( !isset( $HTTP_RAW_POST_DATA ) ) $HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );

@$Server -> service($HTTP_RAW_POST_DATA);

?>

when I call the function "GetClientInfo", I always get an empty array:

    Array
    (
    [0] => Array
    (
        [0] => Array
            (
            )

        [1] => Array
            (
            )

        [2] => Array
            (
            )

        [3] => Array
            (
            )

        [4] => Array
            (
            )

        [5] => Array
            (
            )

        [6] => Array
            (
            )

    )

)

The client calls the function:

    <?php

    require_once('lib/nusoap.php');

    $wsdl = "http://server/server.php?wsdl";
    $client = new nusoap_client($wsdl, 'wsdl');

    $result = $client -> call('GetClientInfo', array('ClientName'=>'Client1'));
    print_r($result);

    ?>

Sorry for the long post. I hope it contains all necessary information. Thanks a lot in advance!

Cheers, Daniel

I found my mistake. The complexType that includes the struct has to look like that:

    $Server -> wsdl -> addComplexType(
    'Clients',
    'complexType',
    'array',
    '',
    'SOAP-ENC:Array',
    array(),
    array(
            array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:ClientInfo')
    ),
    'tns:ClientInfo'

So 'tns:ClientInfo' instead of 'tns:Clients' in the last line.

Here is a fully functioning example:

server.php

    <?php
    // Includes
    require_once ('lib/nusoap.php');
    require('mysql.php');
    require('cc_functions.php');

    // General SOAP configuration
    $ServerName = 'server';
    $ServiceName = 'CentralConfigService';
    $ServiceURL = 'http://' . $ServerName . '/' . $ServiceName;
    $Server = new soap_server();
    $Server -> configureWSDL($ServiceName, $ServerName . '/' . $ServiceName);

    function GetClientInfo($ClientName)
    {
    $Clients = array();
    $Clients1 = array(
                    'HostName' => 'testiname',
                    'IP' => 'testip',
                    'Type' => 'testtype',
                    'Config' => 'testconfig',
                    'Routines' => 'testroutines',
                    'Files' => 'testfiles',
                    'Access' => 'testaccess');

    $Clients2 = array(
                    'HostName' => 'testiname2',
                    'IP' => 'testip2',
                    'Type' => 'testtype2',
                    'Config' => 'testconfig2',
                    'Routines' => 'testroutines2',
                    'Files' => 'testfiles2',
                    'Access' => 'testaccess2');
    array_push($Clients, $Clients1);
    array_push($Clients, $Clients2);
    return $Clients;
    }


    $Server -> wsdl -> addComplexType(
    'ClientInfo',
    'complexType',
    'struct',
    'all',
    '',
    array(
            'ID' => array('name' => 'ID', 'type' => 'xsd:integer'),
            'HostName' => array('name' => 'HostName', 'type' => 'xsd:string'),
            'IP' => array('name' => 'IP', 'type' => 'xsd:string'),
            'Type' => array('name' => 'Type', 'type' => 'xsd:string'),
            'Config' => array('name' => 'Config', 'type' => 'xsd:string'),
            'Routines' => array('name' => 'Routines', 'type' => 'xsd:string'),
            'Files' => array('name' => 'Files', 'type' => 'xsd:string'),
            'Access' => array('name' => 'Access', 'type' => 'xsd:string')
    )
    );


    $Server -> wsdl -> addComplexType(
    'Clients',
    'complexType',
    'array',
    '',
    'SOAP-ENC:Array',
    array(),
    array(
            array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:ClientInfo[]')
    ),
    'tns:ClientInfo'
    );


    $Server -> register(
    'GetClientInfo',
    array('ClientName' => 'xsd:string'),
    array('return' => 'tns:Clients'),
    $ServiceURL,
    $ServiceURL . '#GetClientInfo',
    '',
    'rpc',
    'Get config by type');


    if (!isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA = file_get_contents('php://input');
    @$Server -> service($HTTP_RAW_POST_DATA);

    ?>

client.php

    <?php

    require_once('lib/nusoap.php');

    $wsdl = "http://server/server.php?wsdl";
    $client = new nusoap_client($wsdl, 'wsdl');

    $result = $client -> call('GetClientInfo', array('ClientName'=>''));
    print_r($result);

    ?>