Client de savon, comment appeler une fonction sur HTTPS avec Authentification HTTP de Base
Ce problème a été de me tuer pour toute la journée.
J'ai un client de service web https://*.asmx?WSDL, avec Authentification HTTP de Base..
Si j'utilise SoapUI pour se connecter au service web, tout fonctionne parfaitement sans erreur que ce soit..
Le problème, c'est quand je passe en PHP...
J'ai réussi à connecter, et je peux obtenir la liste des fonctions à partir du serveur à l'aide de soapclient extension pour php ( je suis à l'aide de PHP 5.3.0 ).
Quand j'essaie d'appeler une fonction à l'aide de la soapclient extension pour PHP, j'obtiens l'erreur suivante:
Fatal error: Uncaught exception de type soapfault: [HTTP] Erreur de Récupérer les en-têtes http dans
C:\www\xpto_Atestes\soapclient.php:26 Stack trace: #0 [interne]: >SoapClient->__doRequest('***...', 'http://****...', 1, 0) #1 >C:\www\xpto_Atestes\soapclient.php(26): SoapClient->__soapCall('login', Array) #2 {principal} >jetés dans C:\www\xpto_Atestes\soapclient.php sur la ligne 26
Plus clair erreur ( quand je fais un print_r de la suite de l'appel):
[faultstring] => Erreur de Récupérer les en-têtes http
[faultcode] => HTTP
Avec les en-têtes suivants envoyé:
POST /*.asmx HTTP/1.1 Host: *.pt Connection: Keep-Alive User-Agent: >PHP-SOAP/5.3.0 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://**/Login" >Content-Length: 264 Authorization: Basic AUTHSECRETPASS
Je suis de l'appeler comme ceci:
$soapParams = array('login' => 'HTTP_LOGIN',
'password' => 'HTTP_PASS',
'authentification' => SOAP_AUTHENTICATION_BASIC,
'trace' => 1,
'exceptions' => 0
);
$client = new SoapClient("https://****.asmx?WSDL", $soapParams);
echo "connexion
";
$params = array('compte' => ", 'numéro de téléphone'=>'NOMBRE', 'password'=>'MOT de passe');
$result = $client->__soapCall("login", $params);
Après un certain temps de googler et essayer de savoir ce que le problème pourrait être, je suis passé à nusoap.. qui à ma misère, il a donné une erreur aussi:
Erreur
Erreur HTTP: socket lecture des en-têtes expiré
Demande
POST /**.asmx HTTP/1.0
Hôte: *.pt
User-Agent: NuSOAP/0.9.5 (1.123)
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: "http://****/Connexion"
Authorization: Basic AUTHSECRETPASS
Content-Length: 481NUMBERPASSWORD
Réponse
Je suis de l'appeler comme ceci:
$client = new nusoap_client("https://**.asmx?WSDL", true);
$client->setCredentials('HTTPUSER','HTTPPASS','base');
$params = array(
'compte' => ",
'numéro de téléphone'=>'NOMBRE',
'password'=>'MOT de passe'
);
$result = $client->call('Login', $params);
Avec nusoap j'ai aussi essayé d'activer activer l'extension curl à faire des appels:
$client->setUseCurl(true);
Mais pas de chance, il continua de donner une erreur:
Erreur HTTP: cURL ERREUR: 56: Échec lors de la réception de données de l'hôte
url: http://*********.asmx
content_type:
http_code: 0
header_size: 0
request_size: 750
filetime: -1
ssl_verify_result: 0
redirect_count: 0
durée_totale: 21.015
namelookup_time: 0
connect_time: 0
pretransfer_time: 0
size_upload: 462
size_download: 0
speed_download: 0
speed_upload: 21
download_content_length: -1
upload_content_length: -1
starttransfer_time: 0
redirect_time: 0
Je suis sûr à 100% que rien n'est de mal avec le webservice, si je peux l'appeler à partir d'SoapUI sans aucun problème, je ne vois pas pourquoi je ne peux pas appeler ça de la part de PHP.
J'rallye ne sais pas plus ce que je peux faire.. je pense que j'ai tout essayé...
Edit: j'ai juste essayé un autre Savon Classe pour PHP, Zend..
Le résultat est:
Fatal error: Uncaught exception de type soapfault: [WSDL] SAVON d'ERREUR: Analyse d'un WSDL: impossible de charger à partir de 'https://**.asmx?WSDL' : échec du chargement de l'entité externe "https://*.asmx?WSDL" C:\www\xpto_Atestes\Zend\Soap\Client\Common.php:51 la trace de Pile:
#0 C:\www\xpto_Atestes\Zend\Soap\Client\Common.php(51): SoapClient->SoapClient ("https://**...', Array)
#1 C:\www****_Atestes\Zend\Soap\Client.php(1032): Zend_Soap_Client_Common->__construct(Array, 'https://**...', Array)
#2 C:\www****_Atestes\Zend\Soap\Client.php(1188): Zend_Soap_Client->_initSoapClientObject()
#3 C:\www***_Atestes\Zend\Soap\Client.php(1112): Zend_Soap_Client->getSoapClient() #4 [interne]: Zend_Soap_Client->__call('Login', Array)
#5 C:\www****_Atestes\zend.php(28): Zend_Soap_Client->Login(Array)
#6 {principal} jeté dans
eh bien, j'ai réussi à résoudre le problème avec NuSoap, le WSDL du service web, nécessaire que les différents champs d'un préfixe, et NuSoap n'ai pas mis.. j'ai donc modifié le code de NuSoap à ajouter le préfixe pour les champs, mais je vous conseille d'utiliser le $client->envoyer méthode, dans lequel vous passez la demande XML en tant que paramètre, de cette façon, vous n'avez pas à changer quoi que ce soit.. si vous avez besoin d'un exemple de dire quelque chose..
Pouvez-vous donner un peu plus de détails de votre solution/contournement s'il vous plaît ? c'est à dire que les Préfixes ?
OriginalL'auteur Tio | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
Juste pour répondre à moi-même, au cas où quelqu'un d'autre voudrait aussi savoir comment je l'ai résolu.
Le problème était le suivant, la demande XML pour l'un des webservices devait être dans ce format:
Quand je mentionne le préfixe, je fais référence à la ns123 partie. Le problème est qu'aucune des bibliothèques de produit à la bonne XML à envoyer au serveur, ils n'auraient jamais mettre le préfixe, de sorte que la demande n'a jamais travaillé.
J'ai d'abord résolu, en allant directement à la NuSoap classe et modifié le code en un seul cours, mais ensuite, j'ai découvert que je pouvais faire ma demande XML avec NuSoap, ce qui a entraîné le code suivant:
Le WebService::CallWebService est juste un wrapper de NuSoap classe qui fait quelque chose comme cela ( et aussi a la gestion des erreurs, de l'ensemble de l'authentification HTTP, etc ):
Iain et tout le monde, j'espère que cela est clair.
OriginalL'auteur Tio