php - SOAP 故障 : object not set to an instance of an object

标签 php soap

我在这里发现了这个问题: 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>";

对于我遇到的主要问题,需要提出一个新问题。

我可能错了,但我认为错误消息的含义是双重的:

  1. 传递给 soap 调用的对象可能根本不是对象。
  2. 传递给 soap 调用的对象可能是一个对象,但如果它的所有属性与服务器期望的不匹配,它将返回该错误。

关于php - SOAP 故障 : object not set to an instance of an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014096/

相关文章:

php - 具有多行结果的 LEFT JOIN

java - 我从 SOAP 服务返回什么以及如何返回?

php - SOAP 错误 fatal error : Uncaught SoapFault exception: [HTTP] Could not connect to host

javascript - qtip2 气球和 php 表 : different balloon content for each row?

javascript - 所有大写文本。有没有办法正确修复 CAPITALIZED 用户输入?

php - Sublime Text 3 - PHP 构建系统

java - 使用 java 从现有 WSDL 文件构建 Web 服务客户端

Java - 如何指定xsd元素依赖于另一个元素

python-3.x - 如何通过 SOAP API 锁定 virtualbox 以获取屏幕截图

PHP undefined variable css