2010-03-29 10 views
10

Sto provando a sviluppare la logica di business per un sito dinamico usando nusoap dal lato server (perché ho bisogno wsdls e l'estensione PHP SOAP non possono generare wsdls) e l'estensione SOAP PHP sul lato client.Come sbarazzarsi di "eccezione Uncaught SoapFault: [Client] sembra che non abbiamo documento XML in ..." errore

Tuttavia, non riesco a ottenere le funzioni di login e getRole corrette. Quando provo a richiamare cliente, ottengo seguente messaggio

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

WSDL esiste su lato server e client non leggerlo (quando ho messo URL sbagliato per WSDL, ottengo un errore).

Qualcuno può aiutare ??

risposta

19

Sembra che il client abbia ricevuto un codice XML non valido, ovvero il WSDL stesso o la risposta restituita dal server. Prova a richiamare il client con l'opzione trace impostata su TRUE e verifica l'invio/ricezione XML effettivi tramite i metodi __getLastRequest() e __getLastResponse().

8

Ho appena avuto un problema simile; il mio servizio è stato echo e ho inserito alcuni dati di debug. Ho rimosso tutte le linee echo e ha funzionato correttamente.

4

Ho lo stesso problema e ho risolto con questo:

Il file server SOAP in PHP ha utf8 codificare con BOM, causando apache rispedire il Segno BOM (3 byte) prima della risposta xml.

Codifica il server di sapone file php con utf8 WITH OUT BOM mark.

Ignacio Gutierrez Torrero

1

Alcune volte la distinta base in grado di generare alcuni caratteri extra che crea questo tipo di problema.

Per rilevare l'eventuale presenza di UTF, vedere questo link.

+2

Anche se questo può teoricamente rispondere alla domanda, sarebbe preferibile (http : //meta.stackexchange.com/q/8259) per consentire all'utente di modificare la risposta in modo da includere le parti essenziali della soluzione e fornire il link come riferimento. –

2

Basta usare trim() per voi args.

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

Nel mio caso, questo errore è apparso quando ho incluso uno script con righe vuote dopo l'etichetta "?>".

Eliminare queste righe risolve il problema

+0

Il mio è stato risolto rimuovendo alcuni spazi bianchi in uno dei file inclusi prima del tag

0

ho un modo per risolvere questo problema. Questa non è una soluzione carina, ma funziona ...

Come non posso fare alcun cambiamento nel mio server mantis, ho deciso di fare questo ...

prima devo tacere SoapFault:

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 
    //); 
} 

In secondo luogo, ho notato che c'era questa tre finali di controllo char a cominciare della mia stringa, così ho rimosso:

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

In terzo luogo, devo mettere "pe>" alla fine della mia stringa, perché era incompleto.

2

Non dimenticare di usare blocco try/catch:

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

Il sotto può essere il problema per alcuni utenti. perché ci sono passato.

Per la versione più recente NuSOAP, il seguito risolverà il problema:

trovare il codice qui sotto in nusoap.php

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

in linea 6132 o qualcosa intorno a questo no.

e commentare IT

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

Dal momento che solo a scopo di debug. quindi non preoccuparti di problemi di funzionalità.

1

Ho lo stesso problema.il mio problema risolto dal set always_populate_raw_post_data a -1 su php.ini.

Trovo questo con l'aggiunta di "traccia" => 1, "eccezioni" => 1 sulle opzioni e utilizzare try catch e ottenere __getLastRequest() e __getLastResponse()

+1

Si noti che always_populate_raw_post_data è stato rimosso da PHP 7.0.0 –