php client de savon, d'erreur, de mauvaise wsdl? “Uncaught exception de type soapfault: [HTTP] impossible de se connecter à l'hôte”
Je suis la plupart du temps nouveau pour le SAVON, j'ai donc fait un petit script de test pour se connecter à mon serveur du client. Ils ont un GetMessage de commande, qui ne nécessite aucune saisie ou d'authentification et est uniquement destiné à tester la connectivité:
<?php
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
$url = "https://test.mycustomer.com/api/TestService.svc?wsdl";
$client = new SoapClient($url, array("trace" => 1, "exception" => 0));
$result = $client->GetMessage(NULL);
echo "<pre>".print_r($result, true)."</pre>";
if($result->GetMessageResult->Status == "Success")
{
echo "Item deleted!";
}
?>
Si je l'exécute en ligne de commande j'obtiens:
Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in /var/www/my.stage.com/htdocs/common/soaptest.php:8
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://459265-d...', 'http://tempuri....', 1, 0)
#1 [internal function]: SoapClient->__call('GetMessage', Array)
#2 /var/www/my.stage.com/htdocs/common/soaptest.php(8): SoapClient->GetMessage(NULL)
#3 {main}
thrown in /var/www/my.stage.com/htdocs/common/soaptest.php on line 8
Et à partir d'un navigateur j'obtiens:
PHP Notice: 'SoapClient::__doRequest() [soapclient.--dorequest]: php_network_getaddresses: getaddrinfo failed: Name or service not known'
Dans leur WSDL de ce service, la chaîne "459265" apparaît ici:
<wsdl:service name="TestService">
<wsdl:port name="BasicHttpBinding_ITestService" binding="tns:BasicHttpBinding_ITestService">
<soap:address location="http://459265-dev1/api/TestService.svc"/>
</wsdl:port>
<wsdl:port name="BasicHttpsBinding_ITestService" binding="tns:BasicHttpsBinding_ITestService">
<soap:address location="https://test.mycustomer.com/api/TestService.svc"/>
</wsdl:port>
</wsdl:service>
Donc ma question est, est-ce correct? Si le WSDL avoir une url locale comme ça, que je ne peux pas obtenir à partir de ma boîte?
Un peu plus d'info, lorsque je fais un var_dump sur __getFunctions et __ _ _ getTypes, je reçois
array(2) {
[0]=>
string(53) "GetMessageResponse GetMessage(GetMessage $parameters)"
[1]=>
string(53) "GetMessageResponse GetMessage(GetMessage $parameters)"
}
array(5) {
[0]=>
string(21) "struct GetMessage {
}"
[1]=>
string(55) "struct GetMessageResponse {
string GetMessageResult;
}"
[2]=>
string(8) "int char"
[3]=>
string(17) "duration duration"
[4]=>
string(11) "string guid"
}
- Sonne comme une question à poser à celui qui soutient que WSDL, mais je pense certainement que vous avez identifié le problème.
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez faire est d'envelopper votre code dans un
try{}, catch{}
bloc. Par exemple,Que le message d'erreur indique,
Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in ....
, si vous avez besoin d'attraper l'exception dans tous les cas. Espérons que cette aide..asmx
, comme dansTestService.asmx
et nonTestService.svc
que vous avez actuellement. J'ai également mis à jour ma réponse.Résolu, en partie. Le problème est dans le fichier wsdl du service de déclaration, où il dispose de deux ports pour la même liaison (voir ci-dessus). En php SoapClient, $emplacement pour __doRequest vient de la première liaison (pardonnez-moi si je suis en utilisant le mauvais terminologie), et l'url est une url locale qui est inaccessible pour moi. J'ai donc fait ceci:
L'extension de SoapClient et primordial __doRequest, j'ai été en mesure de définir $emplacement de l'url je savait travailler. Il a couru de nouveau et a obtenu le message de bienvenue - yipee! Pas une bonne solution, car je voudrais adresser un nouveau client pour chaque service, mais de le corriger tout ce que j'ai à faire est de prendre le hard codé url, remplacer la domaine local dans $lieu avec le domaine externe, et ensuite appeler __doRequest avec qui, et il va travailler avec tous les services.