2017-04-11 103 views
5

Mam usługę internetową i wzywam jednego ze swoich operacji za pomocą klienta SOAP w PHP, ale wszystkie uzyskać jest to ["any"]=> string(120) "falseObject reference not set to an instance of an object.Dlaczego pojawia się ten błąd "Odwołanie falseObject nie jest ustawione na wystąpienie obiektu." gdy zgłoszę operację w moim usługa

Chcę wiedzieć, czy jest coś złego w moim kodu ponieważ wierzę, że moje połączenie z serwisem sieciowym działa na poziomie 100%.

Czy jest coś nie tak w ciągu xml, który tworzę?

operacja jest:

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

i opis jego parametrów w 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> 

My mydła i PHP kod jest następujący:

<?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); 
?> 

Żądanie SOAP jest następujące:

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> 

Odpowiedź 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 wyjście jest:

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

EDIT: Próbowałem uzyskać xml prośbę za pomocą htmlentities($client->__getLastRequest()) który pokazuje mi pusty korpus moją prośbę :

========= 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> " 
+0

być może robi obiekt istnieje – Rico

+0

korzystanie w XML, aby sprawdzić, czy XML został nieprawidłowo uformowane – Rico

+0

ponieważ reakcja ma 200 to oznacza, że ​​wszystko jest prawidłowe, ale u r czytania właściwości dla obiektu, który jest zerowa – Rico

Odpowiedz

0

Najprawdopodobniej komunikujesz się z usługą .NET. Ten komunikat o błędzie jest w zasadzie komunikatem "zmienna niezdefiniowana".

Plik WSDL mówi, że żądanie musi zawierać dwie jednostki: xmlIslem i xmlYetki. Ale ich wewnętrzna struktura nie jest właściwie zdefiniowana, może być "dowolna". Nie oznacza to jednak, że usługa usuwania nie oczekuje podania pewnych danych. Wygląda na to, że musisz przekazać pewne dane, których nie masz, stąd błąd.

Chciałbym skontaktować się z dostawcą usług internetowych i poprosić o dokumentację lub konkretne przykłady wniosków.

+0

co robi ta linia do strtoXmldocument ("". $ Nazwa użytkownika. "". $ Hasło. "") -> documentElement); o.O – Rico

+0

@Rico ma parsować XMLstring do XMLDOM Obj, jednak jeśli ma niepoprawny XML, to nie będzie działać, powinien mieć nagłówek '