PHP NuSoap Server возвращает массив сложных типов
Есть много вопросов, касающихся этого онлайн, которые просто остаются без ответа, и я ищу решение повсюду. Итак, у меня есть Soap Server с NuSoap, и я пытаюсь вернуть массив строк базы данных (смоделированный здесь как жестко закодированный список игровых объектов PS4).
Приведенный ниже код работает (с небольшими изменениями) для возврата одного массива, однако я не могу получить более 1 из них для возврата.
У кого-нибудь есть решение для этого, поскольку я потратил день, пробуя различные решения онлайн, а также приведенный ниже код:
//Settings
$ns = 'http://'.$_SERVER['HTTP_HOST'].'/index.php/soapserver/';
$this->load->library("Nusoap_library");
$this->nusoap_server = new soap_server();
$this->nusoap_server->configureWSDL("Nusoap Server", $ns);
$this->nusoap_server->wsdl->schemaTargetNamespace = $ns;
//Complex Types and Function registers on server
// Complex Type "Game":
$this->nusoap_server->wsdl->addComplexType(
'Game', // the type's name
'complexType',
'struct',
'all',
'',
array(
'title' => array('name'=>'title','type'=>'xsd:string'),
'description' => array('name'=>'description','type'=>'xsd:string'),
'price' => array('name'=>'price','type'=>'xsd:string'),
)
);
// Complex Type "Games" (array of Game):
$this->nusoap_server->wsdl->addComplexType(
'Games',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(),
array(
array(
'ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:Game[]'
)
),
'tns:Game'
);
// Get_Games
$this->nusoap_server->register(
'get_games',
array('instance_id' => 'xsd:string'),
array('return'=>'tns:Games'),
'',
false,
'rpc',
'encoded',
'Return array of Games'
);
// [REGISTERED METHODS]:
function get_games($instance_id)
{
// [Hardcoded Games list]:
$games = array(
array(
'title' => 'Killzone: Shadow Fall',
'description' => 'test desc ',
'price' => '49.99'
),
array(
'title' => 'Battlefield',
'description' => 'blah blah',
'price' => '54.99'
)
);
return $games;
}
ВОПРОС:
Какие изменения мне нужно внести в приведенный выше код, чтобы этот сервер возвращал массив игровых объектов.
Это работает нормально, если я возвращаю $games[0] с некоторыми незначительными изменениями в коде, однако я не могу заставить работать приведенный выше код.
Любая помощь или совет приветствуется...
РЕДАКТИРОВАТЬ:
Я постоянно получаю следующую ошибку:
Error
XML error parsing SOAP payload on line 10: Invalid document end
Response
HTTP/1.1 200 OK
Date: Sun, 16 Mar 2014 20:35:35 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.6
X-Powered-By: PHP/5.5.6
X-SOAP-Server: NuSOAP/0.9.5 (1.123)
Content-Length: 1688
Content-Type: text/xml; charset=ISO-8859-1
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
<h4>A PHP Error was encountered</h4>
<p>Severity: Notice</p>
<p>Message: Array to string conversion</p>
<p>Filename: lib/nusoap.php</p>
<p>Line Number: 6132</p>
</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
<h4>A PHP Error was encountered</h4>
<p>Severity: Notice</p>
<p>Message: Array to string conversion</p>
<p>Filename: lib/nusoap.php</p>
<p>Line Number: 6132</p>
</div><?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 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://localhost/index.php/soapserver/"><SOAP-ENV:Body><ns1:get_gamesResponse xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"><return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:Game[2]"><item xsi:type="tns:Game"><title xsi:type="xsd:string">Killzone: Shadow Fall</title><description xsi:type="xsd:string">test desc</description><price xsi:type="xsd:string">49.99</price></item><item xsi:type="tns:Game"><title xsi:type="xsd:string">Battlefield</title><description xsi:type="xsd:string">blah blah</description><price xsi:type="xsd:string">54.99</price></item></return></ns1:get_gamesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
1 ответ
Вот что я сделал:
// Complex Array Keys and Types ++++++++++++++++++++++++++++++++++++++++++
$server->wsdl->addComplexType('notaryConnectionData','complexType','struct','all','',
array(
'id' => array('name'=>'id','type'=>'xsd:int'),
'name' => array('name'=>'name','type'=>'xsd:string')
)
);
// *************************************************************************
// Complex Array ++++++++++++++++++++++++++++++++++++++++++
$server->wsdl->addComplexType('notaryConnectionArray','complexType','array','','SOAP-ENC:Array',
array(),
array(
array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:notaryConnectionData[]'
)
)
);
// *************************************************************************
// This is where I register my method and use the notaryConnectionArray
$server->register("listNotaryConnections",
array('token' => 'xsd:string'),
array('result' => 'xsd:bool', 'notary_array' => 'tns:notaryConnectionArray', 'error' => 'xsd:string'),
'urn:closingorder',
'urn:closingorder#listNotaryConnections',
'rpc',
'encoded',
'Use this service to list notaries connected to the signed-in title company.');
// In my function, I query the data and do:
$list = array();
$results = mysql_query($query);
while($row = mysql_fetch_assoc($results)) {
array_push($list, array('id' => intval($row['na_id']), 'name' => $row['agency_name']));
}
return array("result" => true, "notary_array" => $list);
// The output is:
Array
(
[result] => 1
[notary_array] => Array
(
[0] => Array
(
[id] => 1
[name] => Agency 1
)
[1] => Array
(
[id] => 3
[name] => Agency 3
)
[2] => Array
(
[id] => 4
[name] => Agency 4
)
)
[error] =>
)
Надеюсь это поможет.