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.
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.
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:
Passé le paramètre SOAP version à SoapClient:
'soap_version' => SOAP_1_1
Sur le fichier de configuration php.ini du serveur, j'ai ajouté:
always_populate_raw_post_data = -1
Un peu tard, mais ce genre d’erreur est souvent causé par un problème côté serveur (sens SOAP):
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).
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
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.
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);
Autant que je sache, l'erreur de l'analyseur SOAP lorsqu'il s'agit d'un XML invalide.
Comme c'était avec moi.
Avertissement: simplexml_load_string (): Entité: ligne 1: erreur d'analyse: XmlParseCharRef: valeur xmlChar non valide 26 po
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("",'',$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.
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.
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".