代码之家  ›  专栏  ›  技术社区  ›  bcmcfc

SOAP错误:对象未设置为对象的实例

  •  3
  • bcmcfc  · 技术社区  · 14 年前

    我在这里找到这个问题: PHP Soap Issue: Server was unable to process request. ---> Object reference not set to an instance of an object

    另一个问题的解决方案不可能与私有WSDL一起使用。

    $response = $client->getTimeZoneTime(array('timezone'=>'ZULU'));
    

    实际上,我需要的是一种方法,将多维PHP数组放入SOAP格式的XML文档中,而不是让它变得疯狂,并生成如下内容,例如:-

    <key>GetTimeZoneTime</key>
    <item>ZULU</item>
    

    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);
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   bcmcfc    14 年前

    对于时区1,添加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调用中的对象可能是一个对象,但如果它的所有属性与服务器期望的不匹配,它将返回该错误。