Я нашел этот вопрос здесь:
Проблема с PHP-мылом: серверу не удалось обработать запрос. ---> Ссылка на объект не установлена на экземпляр объекта
У меня похожая проблема, только WSDL является частной, поэтому я решил, что попробую заставить работать SOAP-клиент с базовым часовым поясом.
Решение в другом вопросе невозможно использовать для частного WSDL.
$response = $client->getTimeZoneTime(array('timezone'=>'ZULU'));
Действительно, мне нужен способ взять многомерный массив PHP и поместить его в сформированный SOAP XML-документ, не сводя с ума и не создавая такие вещи, как, например, в этом: -
<key>GetTimeZoneTime</key>
<item>ZULU</item>
Вот мой PHP:
<code>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 "
";
} catch (SoapFault $ exception) {
echo "
\n";
echo "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
echo "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
echo $exception;
echo "
";
}
Это запрос, который он выдает:
<?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);