IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Webservice d'une machine distante


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    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 : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    oui, il est possible de faire ça. Quel webservice veux tu utiliser?

    http://php.net/manual/en/refs.webservice.php

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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 : 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/>'."
    ";
    }
     
    ?>
    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 : 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; 
    }
    ?>
    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
    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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    Le fichier index.php m'a renvoyé

    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)
    Ca veut dire qu'il a réussi à se co ?

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Chacune des lignes affichées correspond aux opérations exposées par le webservice.

    Sais-tu laquelle tu veux utiliser ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    Ça veut dire que la connexion est belle et bien faite ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    ç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 : 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; 
    }?>
    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...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    Oui je commence à y voir plus clair, je comprends mieux (grâce à toi/vous)

    Pour l'appel j'avais fait ceci :

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

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

    Cordialement,

    HPL76

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    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

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    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

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    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

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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

  15. #15
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    ç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).

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = $client->__soapCall ('Login', $param);
    J'ai fait ceci pour récupérer l'id :
    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));
    }
    J'ai ensuite fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result2 = $client2->__soapCall ('ExecuteSql', $param2);
    mais nada, nothing, que de chi à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stdClass Object ( [ExecuteSqlResult] => )
    Il faut utiliser autre chose que __soapCall ? Il faut se tourner vers __doRequest ou ca n'a rien à voir ?

    HPL76

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    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...

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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

  19. #19
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    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 !

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    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 : 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>
    Si c'est pas ça, je peux trouver où ce que tu me demandes ?

    Bien cordialement,

    hpl

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tuer un processus sur une machine distante
    Par nuke_y dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 16/11/2004, 10h55
  2. Réponses: 8
    Dernier message: 13/07/2004, 10h00
  3. [VB.NET] Import de fichiers d'une machine distante
    Par Bill_Baroud dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/06/2004, 14h16
  4. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 10h46
  5. Réponses: 4
    Dernier message: 10/09/2002, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo