PHP nusoap 调用 returns bool false 而不是 complexType 数组
PHP nusoap call returns bool false instead of complexType array
我正在尝试从 php 服务器获取复杂类型,并通过操作获取动物数组(wsdl 中定义的复杂类型),该数组定义为 ConjuntAnimals 作为数组动物对象。
但是当我执行 $result = $client->call('consulta_gossos', $params);
时,我得到 returned 一个 bool (false)。我已经调试和记录了很长时间,我看到在 soap 操作内部,就在 returning 之前,它的值是一个动物数组(它应该 return),但在客户端我没有得到这个 returned.
意识到之后,我猜可能是我的complexType定义错了,但是我对比了很多例子,不应该是这样的...
此外,(也许有帮助)我记录了这个错误:
[10-Dec-2016 12:59:11 America/New_York] PHP Catchable fatal error: Object of class stdClass could not be converted to string in /home/cabox/workspace/lib/nusoap.php
on line 6132
[10-Dec-2016 12:59:11 America/New_York] Response not of type text/xml: text/html
我知道它需要 xml 响应,所以我尝试 return json_encode($gossos)
而不是 $gossos
,但随后它记录了这个:
[10-Dec-2016 13:11:34 America/New_York] XML error parsing SOAP payload on line 2: Invalid document end
这里我添加了客户端和服务器代码:
客户:
<?php
require_once('./lib/nusoap.php');
$wsdl='http://php-ad-msk1416368101.codeanyapp.com/soapserver.php?wsdl';
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
$client = new nusoap_client($wsdl,'wsdl');
$client->encode_utf8 = false;
$client->decode_utf8 = false;
$client->soap_defencoding = 'utf-8';
$err = $client->getError();
if ($err) {
echo "Constructor error" . $err;
exit();
}
$edat = $_GET['edat'];
$raca = $_GET['raca'];
$vacunat = $_GET['vacunes'];
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
$result = $client->call('consulta_gossos', array('edat' => $edat, 'raca' => $raca, 'vacunat' => $vacunat));
$err = $client->getError();
error_log($err);
error_log(json_encode($result));
echo 'Type: '.gettype($result).', size: '.sizeOf($result);
?>
`
<?php
require_once('./lib/nusoap.php');
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );
$server = new nusoap_server;
$server->soap_defencoding = 'utf-8';
$server->encode_utf8 = false;
$server->decode_utf8 = false;
$server->configureWSDL('server','urn:server');
$server->wsdl->schemaTargetNamespace = 'urn:server';
$server->wsdl->addComplexType('Animal',
'complexType',
'struct',
'all',
'',
array(
'xip' => array('name' => 'xip', 'type' => 'xsd:int'),
'nom' => array('name' => 'nom', 'type' => 'xsd:string'),
'edat' => array('name' => 'edat', 'type' => 'xsd:int'),
'vacunat' => array('name' => 'vacunat', 'type' => 'xsd:string'),
'menjar' => array('name' => 'menjar', 'type' => 'xsd:string'),
'data_entrada' => array('name' => 'data_entrada', 'type' => 'xsd:string'),
)
);
$server->wsdl->addComplexType('ConjuntAnimals',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(),
array(
array('ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:Animal[]')
),
'tns:Animal'
);
$server->register('consulta_gossos',
array('edat' => 'xsd:string',
'raca' => 'xsd:string',
'vacunat' => 'xsd:string'),
array('return' => 'tns:ConjuntAnimals'), //output
'urn:server', //namespace
'urn:server#consulta_gossos', //SOAP action
'rpc',
'encoded',
'Consultar els gossos que compleixen el filtre');//description
function consulta_gossos($edat, $raca, $vacunat) {
$servername = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'bd_refugi';
$vacunes = ($vacunat =='si') ? 1 : 0;
$sql_edat = ($edat == 'gran') ? ' edat > 5 ' : ' edat <= 5 ';
$connection = new mysqli($servername, $username, $password, $dbname);
$sql = 'select * from gossos where '.$sql_edat.' and raca="'.$raca.'" and vacunat='.$vacunes;
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos->xip=$row['xip'];
$gos->nom=$row['nom'];
$gos->edat=$row['edat'];
$gos->vacunat=$row['vacunat'];
$gos->menjar=$row['menjar'];
$gos->data_entrada=$row['data_entrada'];
array_push($gossos,$gos);
}
error_log(json_encode($gossos));
error_log('-----------------------------------------');
return json_encode($gossos);
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
`
抱歉缩进,复制粘贴代码后我的眼睛也流血了。
编辑:抛开上面显示的错误,问题打算更多地关注为什么 returning 一个 "correct" 数组,在客户端我得到一个空数组一旦我摆脱了关闭所有这些错误。
经过几个小时的单独调试和测试,我终于解决了这个问题。
我正在 return 构建一个由我称之为结构的数组组成(抱歉我是 PHP 的新手,仍然不知道俚语)从我得到的东西构建mysql 查询。问题是它们应该是数组,所以我添加了我更改过的代码:
之前(不工作):
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos->xip=$row['xip'];
$gos->nom=$row['nom'];
$gos->edat=$row['edat'];
$gos->vacunat=$row['vacunat'];
$gos->menjar=$row['menjar'];
$gos->data_entrada=$row['data_entrada'];
array_push($gossos,$gos);
}
return json_encode($gossos);
(工作后):
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos = array('xip' => intval($row['xip']),
'nom' => $row['nom'],
'edat' => intval($row['edat']),
'vacunat' => $row['vacunat'],
'menjar' => $row['menjar'],
'data_entrada' => $row['data_entrada'],
'sexe' => $row['sexe'],
'raca' => $row['raca']
);
array_push($gossos,$row);
}
return $gossos;
我也 return 使用 json 编码(我真的不知道为什么,我想是为了尝试......),现在我可以 return 数组没有得到我遇到的那些错误。
编辑:哦!并在nusoap.php中注释掉第6132行,不做,还是会报错!
我正在尝试从 php 服务器获取复杂类型,并通过操作获取动物数组(wsdl 中定义的复杂类型),该数组定义为 ConjuntAnimals 作为数组动物对象。
但是当我执行 $result = $client->call('consulta_gossos', $params);
时,我得到 returned 一个 bool (false)。我已经调试和记录了很长时间,我看到在 soap 操作内部,就在 returning 之前,它的值是一个动物数组(它应该 return),但在客户端我没有得到这个 returned.
意识到之后,我猜可能是我的complexType定义错了,但是我对比了很多例子,不应该是这样的...
此外,(也许有帮助)我记录了这个错误:
[10-Dec-2016 12:59:11 America/New_York] PHP Catchable fatal error: Object of class stdClass could not be converted to string in /home/cabox/workspace/lib/nusoap.php
on line 6132
[10-Dec-2016 12:59:11 America/New_York] Response not of type text/xml: text/html
我知道它需要 xml 响应,所以我尝试 return json_encode($gossos)
而不是 $gossos
,但随后它记录了这个:
[10-Dec-2016 13:11:34 America/New_York] XML error parsing SOAP payload on line 2: Invalid document end
这里我添加了客户端和服务器代码:
客户:
<?php
require_once('./lib/nusoap.php');
$wsdl='http://php-ad-msk1416368101.codeanyapp.com/soapserver.php?wsdl';
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
$client = new nusoap_client($wsdl,'wsdl');
$client->encode_utf8 = false;
$client->decode_utf8 = false;
$client->soap_defencoding = 'utf-8';
$err = $client->getError();
if ($err) {
echo "Constructor error" . $err;
exit();
}
$edat = $_GET['edat'];
$raca = $_GET['raca'];
$vacunat = $_GET['vacunes'];
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
$result = $client->call('consulta_gossos', array('edat' => $edat, 'raca' => $raca, 'vacunat' => $vacunat));
$err = $client->getError();
error_log($err);
error_log(json_encode($result));
echo 'Type: '.gettype($result).', size: '.sizeOf($result);
?>
`
<?php
require_once('./lib/nusoap.php');
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );
$server = new nusoap_server;
$server->soap_defencoding = 'utf-8';
$server->encode_utf8 = false;
$server->decode_utf8 = false;
$server->configureWSDL('server','urn:server');
$server->wsdl->schemaTargetNamespace = 'urn:server';
$server->wsdl->addComplexType('Animal',
'complexType',
'struct',
'all',
'',
array(
'xip' => array('name' => 'xip', 'type' => 'xsd:int'),
'nom' => array('name' => 'nom', 'type' => 'xsd:string'),
'edat' => array('name' => 'edat', 'type' => 'xsd:int'),
'vacunat' => array('name' => 'vacunat', 'type' => 'xsd:string'),
'menjar' => array('name' => 'menjar', 'type' => 'xsd:string'),
'data_entrada' => array('name' => 'data_entrada', 'type' => 'xsd:string'),
)
);
$server->wsdl->addComplexType('ConjuntAnimals',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(),
array(
array('ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:Animal[]')
),
'tns:Animal'
);
$server->register('consulta_gossos',
array('edat' => 'xsd:string',
'raca' => 'xsd:string',
'vacunat' => 'xsd:string'),
array('return' => 'tns:ConjuntAnimals'), //output
'urn:server', //namespace
'urn:server#consulta_gossos', //SOAP action
'rpc',
'encoded',
'Consultar els gossos que compleixen el filtre');//description
function consulta_gossos($edat, $raca, $vacunat) {
$servername = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'bd_refugi';
$vacunes = ($vacunat =='si') ? 1 : 0;
$sql_edat = ($edat == 'gran') ? ' edat > 5 ' : ' edat <= 5 ';
$connection = new mysqli($servername, $username, $password, $dbname);
$sql = 'select * from gossos where '.$sql_edat.' and raca="'.$raca.'" and vacunat='.$vacunes;
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos->xip=$row['xip'];
$gos->nom=$row['nom'];
$gos->edat=$row['edat'];
$gos->vacunat=$row['vacunat'];
$gos->menjar=$row['menjar'];
$gos->data_entrada=$row['data_entrada'];
array_push($gossos,$gos);
}
error_log(json_encode($gossos));
error_log('-----------------------------------------');
return json_encode($gossos);
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
`
抱歉缩进,复制粘贴代码后我的眼睛也流血了。
编辑:抛开上面显示的错误,问题打算更多地关注为什么 returning 一个 "correct" 数组,在客户端我得到一个空数组一旦我摆脱了关闭所有这些错误。
经过几个小时的单独调试和测试,我终于解决了这个问题。
我正在 return 构建一个由我称之为结构的数组组成(抱歉我是 PHP 的新手,仍然不知道俚语)从我得到的东西构建mysql 查询。问题是它们应该是数组,所以我添加了我更改过的代码:
之前(不工作):
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos->xip=$row['xip'];
$gos->nom=$row['nom'];
$gos->edat=$row['edat'];
$gos->vacunat=$row['vacunat'];
$gos->menjar=$row['menjar'];
$gos->data_entrada=$row['data_entrada'];
array_push($gossos,$gos);
}
return json_encode($gossos);
(工作后):
$res = $connection->query($sql);
$gossos = array();
while ($row=$res->fetch_assoc()) {
$gos = array('xip' => intval($row['xip']),
'nom' => $row['nom'],
'edat' => intval($row['edat']),
'vacunat' => $row['vacunat'],
'menjar' => $row['menjar'],
'data_entrada' => $row['data_entrada'],
'sexe' => $row['sexe'],
'raca' => $row['raca']
);
array_push($gossos,$row);
}
return $gossos;
我也 return 使用 json 编码(我真的不知道为什么,我想是为了尝试......),现在我可以 return 数组没有得到我遇到的那些错误。
编辑:哦!并在nusoap.php中注释掉第6132行,不做,还是会报错!