Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2011, 14h35   #1
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
Par défaut Webservice d'une machine distante

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
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 15h01   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
oui, il est possible de faire ça. Quel webservice veux tu utiliser?

http://php.net/manual/en/refs.webservice.php
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 15h54   #3
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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

Code :
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/>'."
";
}
 
?>
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.

Voici le fichier client.php
Code :
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; 
}
?>
et enfin le serveur.php
Code :
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>'; 
}
?>
Tu me conseilles autre chose ? Que dois-je faire ? Je voudrais simplement dans un premier temps établir une connexion au webservice...

HPL76
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h23   #4
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
Le fichier index.php m'a renvoyé

Code :
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)
Ca veut dire qu'il a réussi à se co ?
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h44   #5
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Chacune des lignes affichées correspond aux opérations exposées par le webservice.

Sais-tu laquelle tu veux utiliser ?
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h00   #6
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
Ça veut dire que la connexion est belle et bien faite ?
Code php :
$client = new SoapClient("http://xx.xx.xx.xx/WS/MonService.asmx?wsdl");
suffit à lui seul sans aucun autre appel à appeler un webservice ?
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.
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h07   #7
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
ç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 :

Code :
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; 
}?>
Es-tu conscient qu'à ce stade tes fichiers client.php et serveur.php ne servent pas ? Seul ton index appelle un webservice distant...

Maintenant il faut que tu fouines dans la wsdl pour savoir comment formater les paramètres à envoyer...
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 18h02   #8
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
Oui je commence à y voir plus clair, je comprends mieux (grâce à toi/vous)

Pour l'appel j'avais fait ceci :

Code :
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;
}
La page me renvoie : stdClass Object ( [LoginResult] => )

Bizarre, non ? Le tableau ne devrait pas être rempli et le xml généré ?

Cordialement,

HPL76
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 18h14   #9
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
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
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 18h20   #10
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Essayes d'encapsuler tes params dans un autre tableau :

Code :
 $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
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2011, 09h57   #11
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h07   #12
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
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
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2011, 10h16   #13
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 14h37   #14
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h19   #15
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
ç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).
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h33   #16
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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 :
Code :
$result = $client->__soapCall ('Login', $param);
J'ai fait ceci pour récupérer l'id :
Code :
1
2
3
foreach ($result as $element) {
$param2 = array('ExecuteSql' => array('id'=>$element, 'requete'=>$req));
}
J'ai ensuite fait :
Code :
$result2 = $client2->__soapCall ('ExecuteSql', $param2);
mais nada, nothing, que de chi à part :
Code :
stdClass Object ( [ExecuteSqlResult] => )
Il faut utiliser autre chose que __soapCall ? Il faut se tourner vers __doRequest ou ca n'a rien à voir ?

HPL76
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 19h43   #17
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
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...
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 13h16   #18
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
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
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 13h47   #19
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
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 !
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 15h18   #20
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 180
Points : 34
Points : 34
Re,

Tu veux que je te donne le résultat/format xml de l'opération ?
Voilà ce que j'ai en ma possession :
Code :
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>
Si c'est pas ça, je peux trouver où ce que tu me demandes ?

Bien cordialement,

hpl
hpl76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h11.


 
 
 
 
Partenaires

Hébergement Web