当我调用webservice中的一个操作时,为什么会出现“falseObject reference not set to an instance of an object.”这个错误?

5

我有一个Web服务,正在使用PHP的SOAP客户端调用其操作之一,但我得到的只是这个:["any"]=> string(120) "falseObject reference not set to an instance of an object.

我想知道我的代码是否出了问题,因为我相信我连接到Web服务是100%有效的。

我创建的XML字符串是否有任何问题?

该操作是:

<wsdl:operation name="XmlIslet">
    <wsdl:input message="tns:XmlIsletSoapIn"/>
    <wsdl:output message="tns:XmlIsletSoapOut"/>
</wsdl:operation>

并且在WSDL中,它的参数描述如下:

<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
        <s:element name="XmlIslet">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="xmlIslem">
                        <s:complexType>
                            <s:sequence>
                                <s:any/>
                            </s:sequence>
                        </s:complexType>
                    </s:element>
                    <s:element minOccurs="0" maxOccurs="1" name="xmlYetki">
                        <s:complexType>
                            <s:sequence>
                                <s:any/>
                            </s:sequence>
                        </s:complexType>
                    </s:element>
                </s:sequence>
            </s:complexType>
        </s:element>
        <s:element name="XmlIsletResponse">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="XmlIsletResult">
                        <s:complexType mixed="true">
                            <s:sequence>
                                <s:any/>
                            </s:sequence>
                        </s:complexType>
                    </s:element>
                </s:sequence>
            </s:complexType>
        </s:element>
    </s:schema>
</wsdl:types>

以下是我使用的SOAP和PHP代码:

<?php
$username = "username";
$password = "password";
$xmlString = "<Firmalar></Firmalar>";

function strtoXmldocument($str)
{
    $dom = new DOMDocument();
    $str1 = $str;
    return $dom->loadXML($str1);
}

function stringToDataset($xmlString, $username, $password)     
{                       
    $client = new SoapClient('http://1.1.1.1/WSTEST/Service.asmx?WSDL');

    $response = $client->XmlIslet(strtoXmldocument($xmlString)->documentElement,  
strtoXmldocument("<Kullanici><Adi>" .$username. "</Adi><Sifre>" .$password. "</Sifre></Kullanici>")->documentElement);

var_dump($response);
}

stringToDataset($xmlString, $username, $password);
?>

SOAP请求如下:
POST /WSTEST/Service.asmx HTTP/1.1
Host: 1.1.1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <XmlIslet xmlns="http://tempuri.org/">
      <xmlIslem>xml</xmlIslem>
      <xmlYetki>xml</xmlYetki>
    </XmlIslet>
  </soap12:Body>
</soap12:Envelope>

SOAP响应:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <XmlIsletResponse xmlns="http://tempuri.org/">
      <XmlIsletResult>xml</XmlIsletResult>
    </XmlIsletResponse>
  </soap12:Body>
</soap12:Envelope>

vardump 输出为:

usernamepasswordobject(stdClass)#2 (1) { ["XmlIsletResult"]=> object(stdClass)#3 (1) { ["any"]=> string(120) "falseObject reference not set to an instance of an object." } } 

编辑: 我尝试使用htmlentities($client->__getLastRequest())获取请求的xml,但是它显示我的请求正文为空:

========= REQUEST ========== 
string(292) 
"<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:XmlIslet>
<ns1:xmlIslem/>
<ns1:xmlYetki/>
</ns1:XmlIslet>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> "

可能对象不存在。 - Rico
使用<faultcode>在XML中检查是否格式不正确。 - Rico
由于响应返回200,这意味着一切正常,但您正在读取一个空对象的属性。 - Rico
@Rico 是哪个对象?我检查了连接,它正常工作,没有抛出任何错误,然后我调用操作 $client->XmlIslet - Basel
https://dev59.com/aYHba4cB1Zd3GeqPOTva?rq=1 - Rico
显示剩余6条评论
1个回答

0

你很可能正在与一个.NET服务进行通信。这个错误信息基本上是一个“变量未定义”的消息。

WSDL文件指出,你的请求必须包含两个实体:xmlIslem和xmlYetki。但它们的内部结构没有被正确定义,可以是任何东西。然而,这并不意味着删除Web服务不希望你提供一些数据。看起来你需要传递一些数据,但你没有,因此出现了错误。

我建议联系Web服务提供商并请求文档或具体的请求示例。


这行代码的作用是将字符串转换为XML文档,并返回文档元素。o.O - Rico
@Rico 这段代码应该将一个XML字符串解析为XML DOM对象,但是如果它的XML无效,它不会工作。首先应该有<?xml...头部。 - Barkermn01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接