web-dev-qa-db-fra.com

SOAP: on dirait que nous n'avons pas de document XML

J'essaie de créer un service Web, mais avant cela, j'essaie d'obtenir un exemple simple que j'ai trouvé sur Internet, mais je continue à avoir l'erreur suivante:

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php:20 Stack trace: #0 [internal function]: SoapClient->__call('getStockQuote', Array) #1 C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php(20): SoapClient->getStockQuote(Array) #2 {main} thrown in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php on line 20

J'utilise nusoap v1.94

Mon code de service Web ressemble à ceci:

function getStockQuote($symbol) {
$price = '1.23';
return $price;
}

require('nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
            array('symbol' => 'xsd:string'),
            array('return' => 'xsd:decimal'),
            'urn:stockquote',
            'urn:stockquote#getStockQuote');

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
                  ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

Je sais qu'une cause est d'avoir des espaces avant ou après vos balises php dans votre script de serveur, mais ce n'est pas le cas. Cela me rend fou depuis des heures! Toute aide serait très appréciée.

11
geoffs3310

Une marque d'ordre des octets (BOM) aurait le même effet qu'un espace avant les balises php. Ici vous trouvez un extrait PHP permettant de détecter et de supprimer une nomenclature. Assurez-vous de configurer votre éditeur pour ne plus insérer la nomenclature.

6
rik

Assez tard, mais en ajoutant mon correctif au profit des autres. J'ai eu une erreur similaire quand j'ai changé mon serveur Apache de 2.2 à 2.4 et PHP 5.4.10 à 5.6.18 sur Windows. Application client utilisée php 5.6.1. Pour résoudre le problème, j'ai effectué les opérations suivantes:

  1. Passé le paramètre SOAP version à SoapClient: 

    'soap_version' => SOAP_1_1

  2. Sur le fichier de configuration php.ini du serveur, j'ai ajouté:

    always_populate_raw_post_data = -1

6
mvsagar

Un peu tard, mais ce genre d’erreur est souvent causé par un problème côté serveur (sens SOAP):

  • contenu d'impression/écho
  • la réponse de rik aussi
  • erreur (par exemple, j'avais actuellement cette erreur à cause d'un nom de fichier mal écrit dans un include, générant une erreur d'inclusion au lieu d'exécuter le script ...)
  • paramètre incorrect dans le serveur SOAP
  • pas le même niveau de compression des deux côtés (si compression utilisée)

Ce message vient de vous informer que le client SOAP n'a pas reçu un XML bien formaté (par exemple, un message d'erreur au lieu de XML).

4
Benj

Cette erreur apparaît également si une réponse XML soap contient des caractères spéciaux Unicode . Dans mon cas, il s’agissait de REMPLACEMENT CHARACTER (U+FFFD).

En détail, la fonction interne de SoapClient xmlParseDocument définit la propriété xmlParserCtxtPtr->wellFormed sur false après l'analyse. Il jette une faute de savon avec looks like we got no XML document.

https://github.com/php/php-src/blob/master/ext/soap/php_packet_soap.c#L46

3
Andrei Zhamoida

définissez always_populate_raw_post_data = -1 dans le fichier php.ini (en supprimant le ;), puis redémarrez le serveur. Cela a bien fonctionné pour moi.

3
Ipsita Rout

J'ai reçu cette erreur lorsque j'interagissais avec l'API Magento, qui chargeait un modèle, qui émettait un avertissement avant de générer la réponse XML qui était à l'origine de l'erreur.

Pour résoudre ce problème, vous pouvez simplement désactiver les avertissements sur la fonction API: error_reporting(0);

2
Kus

Autant que je sache, l'erreur de l'analyseur SOAP lorsqu'il s'agit d'un XML invalide.

Comme c'était avec moi.

  1. Activer l'affichage de l'erreur
  2. effectué dans try-catch et dans l'appel de capture __getLastResponse
  3. J'attrape une autre erreur:

Avertissement: simplexml_load_string (): Entité: ligne 1: erreur d'analyse: XmlParseCharRef: valeur xmlChar non valide 26 po

  1. Le premier patient était PHP 5.3. Une fois que vous avez exécuté le script sur PHP5.4, l’erreur est devenue plus informative - je jure sur un caractère non valide, à cause duquel, vraisemblablement, je suis tombé sur l’analyseur SOAP.

En conséquence, j'ai obtenu le code suivant: 

$params = array(...);
try
{
    $response = $client->method( $params );
}
catch(SoapFault $e)
{
    $response = $client->__getLastResponse();
    $response = str_replace("&#x1A",'',$response); ///My Invalid Symbol
    $response = str_ireplace(array('SOAP-ENV:','SOAP:'),'',$response);
    $response = simplexml_load_string($response);
}

Si quelqu'un dira dans les commentaires ce qu'est un symbole, je vous en serai reconnaissant.

1
borodatych

Essayez de regarder dans le journal de votre serveur. Si vous utilisez nginx, consultez le fichier /var/log/nginx/error.log.if "Autorisation refusée", veuillez changer le propriétaire du répertoire associé. J'espère que cela fonctionnera.

0
Boush

Une autre solution possible ...

J'ai eu le même problème, je devenais fou. La solution était simple. Vérification de mon serveur ... parce que c'est une erreur de serveur. Mon erreur était que j'avais mis "rcp" au lieu de "rpc".

0
Vrian7