2010-03-29 882 views
10

Estoy tratando de desarrollar lógica de negocio para un sitio dinámico utilizando nusoap en el lado del servidor (porque necesito wsdls y la extensión SOAP de PHP no pueden generar wsdls) y la extensión de SOAP de PHP en el lado del cliente.Cómo deshacerse de "Excepción de SoapFault no detectada: [Cliente] parece que no tenemos ningún documento XML en ..." error

Sin embargo, no puedo acceder ni siquiera a las funciones de la derecha. Cuando trato de invocar cliente, consigo siguiente mensaje

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

Wsdl existe en el lado del servidor, y el cliente lo hace leer (cuando pongo URL incorrecta para WSDL, me sale un error).

¿Alguien puede ayudar?

Respuesta

19

Parece que su cliente recibe algún XML no válido, ya sea el propio WSDL o la respuesta devuelta por el servidor. Intente invocar al cliente con la opción trace establecida en VERDADERO y verifique el envío/recepción XML real a través de los métodos __getLastRequest() y __getLastResponse().

8

Acabo de tener un problema similar; Resulta que mi servicio fue echo obteniendo algunos datos de depuración. Eliminé todas las líneas echo y funcionó bien.

4

tengo el mismo problema, y ​​he resuelto con esto:

El archivo de servidor SOAP en PHP tiene utf8 codifica con la lista de materiales, causando Apache devuelven el Marca de BOM (3 bytes) antes de la respuesta xml.

Codifica tu servidor de archivos php soap con utf8 WITH OUT BOM mark.

Ignacio Gutiérrez Torrero

1

Algunas veces a la lista de materiales puede generar algunos caracteres adicionales que crea este tipo de problema.

Para detectar si hay una lista de materiales para UTF, vea este link.

+2

Si bien esto puede responder teóricamente la cuestión, sería preferible (http : //meta.stackexchange.com/q/8259) para que edite la respuesta e incluya las partes esenciales de la solución y proporcione el enlace de referencia. –

2

Simplemente use trim() para usted args.

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

En mi caso, este error apareció cuando incluí una secuencia de comandos con líneas en blanco después de la etiqueta "?>".

Eliminar estas líneas resuelve el problema

+0

Se solucionó el problema eliminando algunos espacios en blanco en uno de los archivos incluidos antes de la etiqueta

0

tengo una manera de resolver este problema. Esta no es una solución bonita, pero funciona ...

Como no puedo hacer ningún cambio en mi servidor mantis, decidí hacer esto ...

En primer lugar tengo que callar 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 
    //); 
} 

En segundo lugar, he notado que había un tres detrás de carbón en el control comienza de mi cadena, por lo que hemos eliminado:

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

Tercero, tengo que poner "pe>" al final de mi cadena, porque estaba incompleta.

2

No se olvide de utilizar bloque try/catch:

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

La continuación puede ser el problema para algunos usuarios. porque he pasado por eso

Para obtener la última versión NuSOAP, el siguiente va a resolver su problema:

encontrar el código de abajo en nusoap.php

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

en línea de 6132 o algo alrededor de este no.

Y COMENTARIO

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

Ya que sólo para fines de depuración. así que no te preocupes por ningún problema de funcionalidad.

1

Tengo el mismo problema. Mi problema resuelto por el conjunto always_populate_raw_post_data a -1 en php.ini.

puedo averiguar esto añadiendo "huella" => 1, "excepciones" => 1 sobre las opciones y utilizar try catch y obtener __getLastRequest() y __getLastResponse()

+1

Tenga en cuenta que always_populate_raw_post_data se ha eliminado desde PHP 7.0.0 –

Cuestiones relacionadas