Ошибка SOAP: объект не установлен в экземпляр объекта - PullRequest
3 голосов
/ 25 октября 2010

Я нашел этот вопрос здесь: Проблема с 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);

1 Ответ

1 голос
/ 26 октября 2010

Для часового пояса добавление параметра 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>";

Для основной проблемы, с которой я столкнулся, это требует нового вопроса.

Возможно, я ошибаюсь, но я понимаю, что значение сообщения об ошибке может быть двояким:

  1. Объект, переданный в мыльный вызов, может вообще не быть объектом.
  2. Объект, переданный в мыльный вызов, может быть объектом, но если все его атрибуты не соответствуют тому, что ожидает сервер, он вернет эту ошибку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...