我在这里发现了这个问题: PHP Soap Issue: Server was unable to process request. ---> Object reference not set to an instance of an object
我有一个类似的问题,只有 WSDL 是私有(private)的,所以我想我会尝试让一个基本的时区 SOAP 客户端工作。
另一个问题中的解决方案对我来说无法与私有(private) WSDL 一起使用。
$response = $client->getTimeZoneTime(array('timezone'=>'ZULU'));
我真正需要的是一种获取多维 PHP 数组并将其放入 SOAP 形成的 XML 文档的方法,而不会变得疯狂并产生类似的东西,对于这个例子,这个:-
<key>GetTimeZoneTime</key>
<item>ZULU</item>
这是我的 PHP:
try {
$WSDL = 'http://www.nanonull.com/TimeService/TimeService.asmx?WSDL';
$client = new SoapClient($WSDL,
array(
"trace" => 1,
"exceptions" => 1,
"soap_version" => SOAP_1_1
));
$xml = '<GetTimeZoneTime><timezone>ZULU</timezone></GetTimeZoneTime>';
$xmlvar = new SoapVar(
$xml,
XSD_ANYXML
);
$response = $client->getTimeZoneTime($xmlvar);
echo "<pre>\n";
echo "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
echo "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
echo "</pre>";
} catch (SoapFault $exception) {
echo "<pre>\n";
echo "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
echo "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
echo $exception;
echo "</pre>";
}
这是它产生的请求:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.Nanonull.com/TimeService/">
<SOAP-ENV:Body>
<GetTimeZoneTime>
<timezone>ZULU</timezone>
</GetTimeZoneTime>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP 错误是:
Server was unable to process request. ---> Object reference not set to an instance of an object.
将多维 PHP 数组转换为适合 SOAP 请求的格式的正确方法是什么?
返回的 SOAP 错误实际上意味着什么?
编辑: 在其他地方进行一些搜索后,我想我应该尝试创建一个 PHP 类来镜像服务器上的变量的方法。这也不起作用。
class TimeZone {
public function __construct ()
{
$this->timezone = 'ZULU';
}
}
$WSDL = 'http://www.nanonull.com/TimeService/TimeService.asmx?WSDL';
$client = new SoapClient($WSDL,
array(
"trace" => 1,
"exceptions" => 1,
"soap_version" => SOAP_1_1
));
$xmlvar = new SoapVar(new TimeZone(), SOAP_ENC_OBJECT, "TimeZone");
$response = $client->getTimeZoneTime($xmlvar);
最佳答案
对于 Timezone,添加 classmap 参数使其工作:
$client = new SoapClient($WSDL,
array(
"trace" => 1,
"exceptions" => 1,
"soap_version" => SOAP_1_1,
"classmap" => array('timezone' => 'TimeZone')
));
$obj = new TimeZone();
$response = $client->getTimeZoneTime($obj);
echo "<h1>".$response->getTimeZoneTimeResult."</h1>";
对于我遇到的主要问题,需要提出一个新问题。
我可能错了,但我认为错误消息的含义是双重的:
- 传递给 soap 调用的对象可能根本不是对象。
- 传递给 soap 调用的对象可能是一个对象,但如果它的所有属性与服务器期望的不匹配,它将返回该错误。
关于php - SOAP 故障 : object not set to an instance of an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014096/