Bonjour,
Je cherche depuis mon site a appelé un webservice sur une machine distante. Est-ce possible ?
Quelqu'un pourrait-il m'indiquer la marche à suivre svp merci. Je n'ai jamais fait et avoue être un peu perdu...
HPL76
Bonjour,
Je cherche depuis mon site a appelé un webservice sur une machine distante. Est-ce possible ?
Quelqu'un pourrait-il m'indiquer la marche à suivre svp merci. Je n'ai jamais fait et avoue être un peu perdu...
HPL76
oui, il est possible de faire ça. Quel webservice veux tu utiliser?
http://php.net/manual/en/refs.webservice.php
Bonjour gene69 et merci de te soucier d'un problème qui n'est pas le tien !
Je suis vraiment novice en la matière.
Voilà, j'ai 3 fichiers : un index.php, un serveur.php et un client.php.
Mon index se présente de la sorte
A la place des "xxx" j'ai mis l'ip, le nom de la machine distante, le nom du webservice avec pour finir .asmx?wsdl.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?php echo '<p>test</p>'; $client = new SoapClient("xxx"); $arFunctions = $client->__getFunctions(); foreach ($arFunctions as $function) { echo $function.'<br/>'." "; } ?>
Voici le fichier client.php
et enfin le serveur.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 <?php // Pour supprimer le cache du web-service ini_set('soap.wsdl_cache_enabled', 0); // Nouveau Client SOAP try { // Nouvelle instance de la classe soapClient $client = new SoapClient('http://localhost/MonWebService/monFormat.wsdl', array('trace' => 1)); $parm = date('Y-m-d'); // Appel de la méthode QuelJour du service web try{ $oReturn = $client -> __soapCall('QuelJour', array('string' =>$parm)); } catch (SoapFault $fault) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } // affiche le résultat var_dump($oReturn); } catch (SoapFault $fault) { echo 'erreur : '.$fault; } ?>
Tu me conseilles autre chose ? Que dois-je faire ? Je voudrais simplement dans un premier temps établir une connexion au webservice...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 <?php // Pour supprimer le cache du web-service ini_set('soap.wsdl_cache_enabled', 0); // Pour définir le temp maximal d'éxecution de notre web-service ini_set('default_socket_timeout', 180); // Nom de notre web-service class Server { // Le service QuelJour que l'on a définit dans notre format wsdl function QuelJour($parm) { return 'Web-Service ok'; } } // On tente d'instancier la classe soapServer // Si cela s'avère impossible, on affiche une erreur try { $server = new SoapServer('monFormat.wsdl', array('trace' => 1,'encoding' => 'ISO-8859-1')); // On définit la classe qui va gérer les requêtes SOAP (pour nous c'est la class Server) $server -> setclass('Server'); $server->setPersistence(SOAP_PERSISTENCE_REQUEST); } catch (Exception $e) { echo 'erreur'.$e; } // Si l'appel provient d'un Web-Service if ($_SERVER['REQUEST_METHOD'] == 'POST') { try { $server -> handle();} catch (Exception $e) { echo 'erreur'.$e; } } // Facultatif seulement pour montrer les fonctions disponibles par le web-service else { echo '<strong>This SOAP server can handle following functions : </strong>'; echo '<ul>'; foreach($server -> getFunctions() as $func) { echo '<li>' , $func , '</li>'; } echo '</ul>'; } ?>
HPL76
Le fichier index.php m'a renvoyé
Ca veut dire qu'il a réussi à se co ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 LoginResponse Login(Login $parameters) AutoLoginResponse AutoLogin(AutoLogin $parameters) LogoutResponse Logout(Logout $parameters) SetSessionValueResponse SetSessionValue(SetSessionValue $parameters) GetSessionValueResponse GetSessionValue(GetSessionValue $parameters) SetBindValueResponse SetBindValue(SetBindValue $parameters) GetBindValueResponse GetBindValue(GetBindValue $parameters) LoginResponse Login(Login $parameters) AutoLoginResponse AutoLogin(AutoLogin $parameters) LogoutResponse Logout(Logout $parameters) SetSessionValueResponse SetSessionValue(SetSessionValue $parameters) GetSessionValueResponse GetSessionValue(GetSessionValue $parameters) SetBindValueResponse SetBindValue(SetBindValue $parameters) GetBindValueResponse GetBindValue(GetBindValue $parameters)
Chacune des lignes affichées correspond aux opérations exposées par le webservice.
Sais-tu laquelle tu veux utiliser ?
Ça veut dire que la connexion est belle et bien faite ?
suffit à lui seul sans aucun autre appel à appeler un webservice ?
Code php : Sélectionner tout - Visualiser dans une fenêtre à part $client = new SoapClient("http://xx.xx.xx.xx/WS/MonService.asmx?wsdl");
Je voudrais être sur de bien comprendre...c'est la dll qui fait ?
A vrai dire, je ne sais pas quelle opération je dois utiliser mais admettons que ce soit la première LoginResponse Login(Login $parameters) ?
En tout cas merci vivement pour votre esprit communautaire !!!
HPL76.
ça veut dire qu'il a bien trouvé la WSDL (le fichier qui décrit tes webservices), qu'il l'a lue et trouvé les opérations disponibles.
Appeler un webservice signifie appeler une opération exposée par le serveur.
Pour appeler la fonction (opération) Login :
Es-tu conscient qu'à ce stade tes fichiers client.php et serveur.php ne servent pas ? Seul ton index appelle un webservice distant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 <?php echo '<p>test</p>'; $client = new SoapClient("xxx"); $arFunctions = $client->__getFunctions(); foreach ($arFunctions as $function) { echo $function.'<br/>'." "; } //Ici tu fiormates ton tableau (ou objet comme tu veux) en fonction du schéma correspondant à l'objet Login $param = array(xxxx); try{ $oReturn = $client -> __soapCall('Login', array('string' =>$param)); } catch (SoapFault $fault) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } // affiche le résultat var_dump($oReturn); } catch (SoapFault $fault) { echo 'erreur : '.$fault; }?>
Maintenant il faut que tu fouines dans la wsdl pour savoir comment formater les paramètres à envoyer...
Oui je commence à y voir plus clair, je comprends mieux (grâce à toi/vous)
Pour l'appel j'avais fait ceci :
La page me renvoie : stdClass Object ( [LoginResult] => )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 try{ $client = new SoapClient ("http://xx.xx.xx.xx/Services/MonService.asmx?wsdl"); $param = array('champ 1'=>'valeur en dur 1', 'champ 2'=>'valeur en dur 2', 'champ 3 '=>'valeur en dur 3');//4ème et 5ème champs sont facultatifs $result = $client->__soapCall ('Fonction', $param); print_r($result); } catch (SoapFault $fault) { echo 'erreur : '.$fault; }
Bizarre, non ? Le tableau ne devrait pas être rempli et le xml généré ?
Cordialement,
HPL76
Là il va falloir que tu nous donnes un peu plus de billes... Au moins les bons noms de champs.
Et aussi le schéma décrivant les objets Login et LoginResponse
Essayes d'encapsuler tes params dans un autre tableau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $param = array('Login' => array('champ 1'=>'valeur en dur 1', 'champ 2'=>'valeur en dur 2', 'champ 3 '=>'valeur en dur 3'));//4ème et 5ème champs sont facultatifs
Bonjour...et je rajouterai 1000 MERCIS, t'es un chef pc.bertineau !!!
Le stdClass Object ( [LoginResult] => ...) me renvoie bien quelque chose maintenant. Comment as-tu su ?
Bien cordialement,
HPL76
J'ai juste eu les mêmes interrogations que toi quand j'ai commencé à utiliser SOAP...
Et d'une manière générale, si la réponse t'arrive encapsulée dans un array('LoginResponse' => array(...)), il y a de grandes chances que la requête doivent l'être également
Tu peux cliquer sur Résolu maintenant et pourquoi pas voter pour mon post qui t'a apporté la solution
C'est chose faite !
Je réitère mes remerciements. si tout le monde pouvait avoir cette attitude
Bien à toi, bonne journée, @bientôt !
HPL76
C'est remoi, désolé.
Le fait d'encapsuler à fonctionner avec stdClass Object ( [LoginResult] => )
Ce qui donnait : $param = array('Login' => array('champ 1'=>'valeur en dur 1', 'champ 2'=>'valeur en dur 2', 'champ 3 '=>'valeur en dur 3'));
Et j'ai beau faire la même chose avec une autre méthode :
$new = array('Fonction2' => array('param1'=>'val1', 'param2'=>'val2'));
J'obtiens un stdClass Object ( [Fonction2Result] => )
Bizarre, non ? J'ai tenté de ré-encapsuler le tout, en vain...
Le fonctionnement est différent ? Tu aurais une idée ?
Cdlt,
HPL76
ça dépend beaucoup des types décrit dans la partie schéma de la wsdl (soit directement dedans, soit via un lien vers un schéma xsd).
Bah je t'explique, la première étape était de récupérer un id de session.
La 2ème étape est d'exécuter à partir de l'id de session une requête SQL basique $req.
A partir de :
J'ai fait ceci pour récupérer l'id :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $result = $client->__soapCall ('Login', $param);
J'ai ensuite fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 foreach ($result as $element) { $param2 = array('ExecuteSql' => array('id'=>$element, 'requete'=>$req)); }
mais nada, nothing, que de chi à part :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $result2 = $client2->__soapCall ('ExecuteSql', $param2);Il faut utiliser autre chose que __soapCall ? Il faut se tourner vers __doRequest ou ca n'a rien à voir ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part stdClass Object ( [ExecuteSqlResult] => )
HPL76
rien à voir. Mais qu'est sensé retourné ton opération executeSQL ?
Qu'as-tu décrit dans la wsdl ? Je peux pas t'aider sans connaître les structures attendues en request et en response...
Bonjour pc.bertineau,
La ligne incriminée est :
$result2 = $client2->__soapCall ('ExecuteSql', $param2);
Le résultat retourné est :
stdClass Object ( [ExecuteSqlResult] => )
J'avais pourtant eu le réflexe d'encapsuler mon array, en vain...
Un var_dump renvoie :
object(stdClass)#4 (1) { ["ExecuteSqlResult"]=> string(283) "" }
Ca veut bien dire qu'il y a du monde, non ?
$param2 récupère l'id de session que tu m'as aidé à récupérer hier et l'autre paramètre est la requête. La fonction ExecuteSql est censée me renvoyer un fichier xml d'un simple select.
Bien à toi !
Mega
et un var_dump($result2=>ExecuteSql) ?
Montre moi ta WSDL ! Cache les URL si c'est sensible mais sans ça je vais pas pouvoir t'aider beaucoup !
Re,
Tu veux que je te donne le résultat/format xml de l'opération ?
Voilà ce que j'ai en ma possession :
Si c'est pas ça, je peux trouver où ce que tu me demandes ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 HTTP POST POST /MesServices/MonService.asmx/TryIt Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length champ1=string&champ2=string HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://.../">string</string> <?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://.../"><fsQuery><Result Count="1" zone1="1" zone2="" zone3="val3" zone4="val4" Editable="0" InsertType="0" Start="0" Range="-1" InsertAllowed="0" UpdateAllowed="0" DeleteAllowed="0"><Flds id="0"><une val="..." /></Flds></Result></fsQuery></string>
Bien cordialement,
hpl
Partager