2010-03-29 6 views
10

Ich versuche, Business-Logik für eine dynamische Website auf Server-Seite mit nusoap zu entwickeln (weil ich brauche wsdls und die PHP SOAP-Erweiterung können keine WSDLs generieren) und die PHP SOAP-Erweiterung auf der Clientseite.Wie loswerden „Uncaught SoapFault Ausnahme: [Client] sieht aus wie wir kein XML-Dokument in got ...“ Fehler

Allerdings kann ich nicht einmal Login und getRole Funktionen richtig bekommen. Wenn ich versuche, Client aufrufen, bekomme ich folgende Meldung

Uncaught SoapFault exception: [Client] looks like we got no XML document in [some paths]... 

Wsdl auf Server-Seite nicht existiert, und Client es liest (wenn ich für Wsdl falsche URL setzen, bekomme ich einen Fehler).

Kann mir jemand helfen ??

Antwort

19

Offenbar empfängt Ihr Client ein ungültiges XML - entweder die WSDL selbst oder die vom Server zurückgegebene Antwort. Versuchen Sie, den Client mit der trace-Option, die auf TRUE gesetzt ist, aufzurufen, und überprüfen Sie das tatsächliche XML-Senden/Empfangen über die Methoden __getLastRequest() und __getLastResponse().

8

Ich hatte gerade ein ähnliches Problem; stellt sich heraus, mein Dienst war echo einige Debug-Daten aus. Ich entfernte alle echo Linien und es hat gut funktioniert.

4

ich das gleiche Problem haben, und ich mit diesem gelöst:

Der Server SOAP-Datei in php hat kodieren UTF-8 mit BOM, was Apache zurückschicken die BOM-Markierung (3 Byte) vor der XML-Antwort.

Verschlüsseln Sie Ihren php-Datei-Soap-Server mit utf8 WITH OUT BOM-Markierung.

Ignacio Gutierrez Torrero

1

Einige Male eine BOM können einige zusätzliche Zeichen erzeugen, die diese Art von Problem schafft.

Um festzustellen, ob es eine UTF BOM diese link zu sehen ist.

+2

Während dies theoretisch die Frage beantworten kann, wäre es bevorzugt, (http : //meta.stackexchange.com/q/8259), damit Sie die Antwort so bearbeiten können, dass sie die wesentlichen Teile der Lösung enthält, und stellen Sie den Link als Referenz bereit. –

2

Verwenden Sie einfach trim() für Ihre Argumente.

$objectRequette = trim($_POST['Requette']) ; 
$client = new SoapClient(null, array(
    'location' => 'http://your.php', 
    'uri'=>'your option', 
)); 
$result = $client->__soapCall('Misyka', array("$objectRequettea")); 
2

In meinem Fall erschien dieser Fehler, wenn ich ein Skript mit leeren Zeilen nach dem "?>" Label einschloss.

diese Zeilen löschen löst das Problem

+0

Mine wurde behoben, indem einige Leerzeichen in einer der enthaltenen Dateien vor dem

0

Ich habe einen Weg, um dieses Problem zu lösen. Das ist keine schöne Lösung, aber es funktioniert ...

Wie kann ich keine Änderung in meinem Mantisserver tun, entschied ich, dies zu tun ...

Zuerst habe ich SoapFault zum Schweigen zu bringen:

try { 
    $client = new SoapClient('http://www.mymantisaddress.com/api/soap/mantisconnect.php?wsdl', array('trace'=> 1, 'exceptions' => 0)); 
    $result = $client->__soapCall($function_name, $args); 
} catch (SoapFault $e) { 
    //$result = array(
    // 'erro' => $e->faultstring 
    //); 
} 

Zweitens habe ich festgestellt, dass es diese drei Hinter in Steuer char meiner Zeichenfolge beginnen, also habe ich es entfernt:

$str = substr($client->__getLastResponse(), 3) . "pe>"; 
print $str; 

Drittens, ich muss "pe>" am Ende meiner Zeichenfolge setzen, weil es unvollständig war.

2

Vergessen Sie nicht, try/catch-Block zu verwenden:

try { 
    var_dump($client->foo()); 
} catch (Exception $e) { 
    echo($client->__getLastResponse()); 
    echo PHP_EOL; 
    echo($client->__getLastRequest()); 
} 
0

Die unten kann das Problem für einige Benutzer sein. weil ich es durchgemacht habe.

Für die neueste nusoap Version wird die unten Ihr Problem lösen:

FIND den Code unten in nusoap.php

$this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); 

in Zeile 6132 oder etwas um diese nicht.

UND KOMMENTAR IT

// $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); 

Da es nur für Debug-Zwecke. also keine Sorgen über Funktionalitätsprobleme.

1

Ich habe das selbe problem.my Problem gelöst von Set always_populate_raw_post_data zu -1 auf php.ini.

ich herausfinden, das durch den Zusatz „trace“ => 1 „Ausnahmen“ => 1 auf Optionen und verwenden try catch und erhalten __getLastRequest() und __getLastResponse()

+1

Bitte beachten Sie, dass always_populate_raw_post_data seit PHP 7.0.0 entfernt wurde –

Verwandte Themen