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

C++ Discussion :

Implémenter un client/serveur gSoap [Tutoriel]


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut Implémenter un client/serveur gSoap
    Bonjour à tous,

    Voilà, j'ai enfin trouvé temps d'écrire ce tuto tant attendu.
    Ce tutoriel permet de créer rapidement un client et/ou un serveur gSoap simple et stand-alone, sous Windows et/ou Linux.
    Vous le trouverez à l'adresse suivante: http://r0d.developpez.com/articles/tuto-gsoap-fr/

    Vous pouvez donc arrêter de me poser des questions sur gSoap par mp, tout est dans le tuto
    En revanche, toute remarque concernant ce tuto est la bienvenue.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Merci pour ce tutoriel présentant gsoap. Clair, avec des exemples et du code source, on voit qu'on peut rapidement mettre en œuvre des RPC (Remote Procedure Call) par dessus SOAP (Simple Object Access Protocol) en C++.

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Bravo pour ce tutoriel.
    Mais je but maintenant sur un problème utilisé un webservice C++ gsoap depuis une application .net.
    Est il possible depuis Visual Studio d'ajouter un Web Reference... ?
    Je continu mais recherche mais si ta des infos merci d'avance.
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  4. #4
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Bon ben finalement j'ai réussi
    1. renommage de la fonction ( qui permet de générer le wsdl )
    int ns__op1( int a, int b, int * r );
    2. On force la version 1.2 de SOAP
    soapcpp2.exe -2 -L mon_cs.h
    3. Dans le ns.wsdl généré modifier l'address pour qu'elle match avec le code du serveur:
    <SOAP:address location="http://localhost:8080"/>
    4. Ajouter dans le serveur la gestion du get et renvoyer le wsdl
    soap.fget = http_get;
    5. Lancer le serveur, puis dans le C# ajouter une référence web.

    La solution modifiées : lien
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    merci themadmax
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 131
    Points
    131
    Par défaut Merci
    Tout d'abord, merci pour ce tutoriel.

    J'essaye de me former aux web-services et à GSoap...

    J'utilise Code Blocks, lorsque je compile le programme serveur que vous avez donné, j'ai eu une erreur, tout d'abord sur les :

    #pragma comment (lib, "wsock32.lib")

    Apparement C::B (mingw) n'accepte pas ce genre d'instruction...

    Donc j'ai ajouté "ws2_32.dll" dans les options de compilation du projet, ça m'a enlevé les warnings sur les "#pragma".

    Mais j'ai des erreurs lors de la compilation toujours, au niveau du fichier "stdsoap2.cpp" il me fait plein d'erreurs :

    "référence indéfinie vers (sendto@24)"

    ... Je dirais que j'ai un problème avec mon pointeur soap tout au long de ce fichier, il doit me manquer une bibliothèque ou un include quelquepart ... Mais je ne vois pas lequel....

    Si vous aviez une petite idée ? Merci

  7. #7
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Code::block pour moi est une IDE, mais je suppose que ton compilo est gcc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment (lib, "wsock32.lib")
    Est une drole d'instruction spécifique au compilo microsoft, qui demande au Linker d'ajouter une lib, zarbe mais super pratique. En gros cela revient a rajouter dans la ligne de cmd de gcc une truc de genre -llib...
    En tout cas tu confond les lib et les dll, pour faire vite les dll sont utilisé seulement lors de l'exécution de ton programme. Les lib soit se rajoute du code static a ton programme soit te permet de te lier a une dll.

    Il faudrait un super post pour bien explique cela à toute le monde
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    l'exemple que je fournis avec Code::Blocks est destiné à être compilé sous linux, donc effectivement, il n'est pas fait pour Windows et tu vas sans doute rencontrer de nombreux problèmes. Pour windows, je te conseille plutôt de prendre la version avec visual studio express (la version gratuite de visual studio) et de l'adapter à Code::Blocks.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 131
    Points
    131
    Par défaut
    Ok merci pour vos explications à tous deux.
    Ca ne fait que 2 semaines que j'ai commencé à apprendre le C++, c'est pour ça que je ne suis pas bien au point, et effectivement je confonds .dll et .lib.

    En installant Visual Studio 2008 Express, j'ai pu obtenir la fameuse "WSock32.lib" (et non pas dll), et l'intégrer au projet sous Code Blocks.

    Le serveur fonctionne maintenant

    J'ai plus qu'à créer le client, et à revoir tout ça en long en large.

    Je dois dire que votre tuto est le seul sur le net qui m'ait aidé, les deux ou trois autres de disponibles, se basent sur des webservices qui n'existent plus et donc inexploitables... (même l'exemple sur le site de GSoap).

    Voilà, le but étant d'intégrer des web-services sécurisés (WS-Security, WS-Adressing) dans une application Windev...

    EDIT : Le client fonctionne aussi, tout marche.
    Bon ben y a du boulot en perspective

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 131
    Points
    131
    Par défaut
    Petite remarque :

    Lorsqu'on génére le .h par le .wdsl, "op1" du .h prends en paramètre réponse une référence "&" et non un pointeur "*"
    (le premier exemple du tuto avec .h directement, prends un pointeur, c'est pour ça que j'en parle)

    il faut donc veiller à ce que la fonction "op1" dans la main() prenne et utilise une référence :
    Et il faut aussi changer le nom de l'opération en ns1__op1 puisque c'est comme ça qu'il la crée dans le .h...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int ns1__op1( struct soap *soap, int a, int b, int & r )
    {
    	std::cout << "op1 appelé avec: a=" << a << ", b=" << b << std::endl;
    	r = 2 * a + b;
    	return SOAP_OK;
    }
    bon ça paraîtra simple à la plupart...

    EDIT :
    En plus ce code était bien présent dans le tuto (Dans la partie WSDL / serveur) ... Désolé.

  11. #11
    Membre extrêmement actif Avatar de eldran64
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 341
    Points : 1 515
    Points
    1 515
    Par défaut
    Bonjour tout le monde,

    Je fais un petit up car j'utilise gSOAP et j'ai quelque soucis...
    Je suis partie de la doc officielle et j'ai fait un web service en c++.
    Seulement voilà, quand je veut écrire mon client java, au moment où il détecte les web services pour mettre le client en place, ça marche pas.

    Je pense que cela vient de mon web service, mais je ne sais pas comment m'y prendre.

    Je fais donc appel à votre gentillesse pour me sortir de ces ténèbres.
    Tout le monde devrait avoir de l'esprit critique car personne ne pourra m'apporter la preuve de l'absence de celui-ci

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Je débutes également avec gSoap.
    Malheureusement ton tutoriel n'est plus en ligne.
    Pourrais-tu le remettre ?

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Vincss Voir le message
    Bonjour,
    Je débutes également avec gSoap.
    Malheureusement ton tutoriel n'est plus en ligne.
    Pourrais-tu le remettre ?
    http://r0d.developpez.com/articles/tuto-gsoap-fr/

  14. #14
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Aaah!
    Merci j'espère que ça va m'aider

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 51
    Points
    51
    Par défaut
    Bonjour.
    Avant tout, merci pour ce tuto qui semble poser de bonnes bases sur l'utilisation de gsaop.

    Je dois apprendre comment créer un client / serveur avec les web service et j'avoue que j'ai beaucoup de mal :/

    Quant on utilise "soapcpp2.exe", on obtient, entre autre, "soapClient.cpp" et "soapServer.cpp". Perso, je n'arrive pas à comprendre "soapClient.cpp". Toutes les fonctions appellaient, les actions faites, ... Même en regardant le code fourni par rOd, j'ai du mal. Comment sait il qu'il faut utiliser soap_init ? Que fait il exactement lors de la transcription des variables ? Et pourquoi ?

    Je suis désolé si ces questions peuvent sembler idiote, mais je patine vraiment dans la choucroute là

    Merci par avance pour toute aide

  16. #16
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Je n'ai fait que le serveur en CPP, je peux t'expliquer comment j'ai procédé :
    • Je crée un template du webserver en C# WCF avec uniquement les définitions des fonctions.
      Je lance celui-ci, je récupère l'adresse du WSDL.
      Après je demande à gSoap de me générer le squelette de mon webserver C++ avec le bat suivant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      @echo off
      set WsdlUrl=http://172.22.25.25:8731/Design_Time_Addresses/WcfServiceLibrary_Template/Service1/?wsdl
      echo Wsdl Url : %WsdlUrl% 
      .\gsoap-2.8\Generated\wsdl2h %WsdlUrl% -o Template.idl
      .\gsoap-2.8\Generated\soapcpp2 -1 -S -L -d .\..\LibWebServer\gSoap -I .\gsoap-2.8\gsoap\import -x Template.idl 
      pause
      Là dans mon fichier LibServer\gSoap, j'ai mes fichiers qui contiennent la définition de mon serveur.
      Après je n'ai plus qu'à implémenter la définition des fonctions décrites dans:
      soapBasicHttpBinding_USCOREIService_USCOREServerObject.h


    Dans les paramètres de tes fonctions tu as trois paramètres :
    L'objet Soap, les paramètres, et la réponse.
    Tu dois initialiser tes objets de réponses avec l'objet Soap par exemple pour renvoyer une string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ns1__GetMapsContentResponse->GetMapsContentResult = soap_new_std__string(_Soap,StrRet.size()+1);
    *ns1__GetMapsContentResponse->GetMapsContentResult = StrRet;
    A la fin de ta réponse tu dois retourner : return SOAP_OK; ou avoir renvoyer une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        soap_new_std__string(pSoap, strlen(pErrorStr));
        soap_receiver_fault(pSoap, pErrorStr, pErrorStr );
        return SOAP_FAULT;

    Il te faut aussi un exemple de code du serveur, je pense que j'avais trouvé le mien directement dans la documentation.
    Si tu ne trouves pas je peux éventuellement te fournir le mien.

    Bonne chance !
    Une fois que tout est mit en place c'est relativement simple à maintenir, mais la mise en place est un peu ardue au départ.
    Pour le client je ne saurais dire, je ne l'ai pas fait !

    Tu peux aussi utiliser SoapUI afin de faire tes tests de serveur.

  17. #17
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par OkamiRyuu Voir le message
    Quant on utilise "soapcpp2.exe", on obtient, entre autre, "soapClient.cpp" et "soapServer.cpp". Perso, je n'arrive pas à comprendre "soapClient.cpp". Toutes les fonctions appellaient, les actions faites, ... Même en regardant le code fourni par rOd, j'ai du mal. Comment sait il qu'il faut utiliser soap_init ? Que fait il exactement lors de la transcription des variables ? Et pourquoi ?
    Bonjour.
    ça fait des années que je n'ai plus utilisé gSoap, donc je ne me souviens plus des détails. Mais ce qu'il faut comprendre, c'est que soapcpp2.exe, en fait, c'est un compilateur! Ce qu'il fait, c'est qu'il génère du code à partir d'une entrée (soit un fichier d'en-tête, soit un wsdl).
    En jouant avec les options, tu peux générer soit le client, soit le serveur, soit les deux. Et c'est dans ce code généré que soap_init() est appelé. Ce code généré, c'est ensuite à toi de le compiler.
    Ensuite dans les détails (comment sont gérés les variables etc.), ce sont des détails auxquels il vaut mieux ne pas trop s'intéresser si tu ne veux pas perdre trop de temps et si tu n'as pas besoin de choses vraiment exotiques. gSoap est quelque chose d'extrêmement complexe. J'avais tenté de regarder ce qu'il y a "sous le capot", mais c'est vraiment pas simple du tout.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Fonctionnement avec SoapUI
    Bonjour,
    je suis tombé sur ce tuto car j'essaie d'implémenter en client soap en Visual C++ (Visual Studio 2017)... et je galère un peu à vrai dire !

    Avec vos sources (upgradées en VS2017), j'ai réussi à compiler client.exe et serveur.exe (dans la version wsdl). Et ça fonctionne (la commande client.exe 5 3 par exemple renvoie bien un résultat).
    Je voulais tester le côté serveur depuis SoapUI, mais lorsque que j'y crée un projet avec my_cd.wsdl j'ai l'erreur "faultCode=UNBOUND_PREFIX: Unable to determine namespace of 'tns:op1Request'".
    Pourtant le wsdl actuel se "compile" bien avec wsdl2h.exe (gSoap 2.8.54).

    J'ai essayé de modifier le wsdl en remplaçant la ligne xmlns:ns="urn:my_cs" par xmlns:tns="urn:my_cs" : du coup ça passe dans SoapUI, mais wsdl2h.exe ne compile plus !

    Avez-vous une idée ?
    Merci d'avance.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/03/2014, 15h43
  2. Client/Serveur - Implémentation Java du type Any CORBA
    Par julian75 dans le forum Général Java
    Réponses: 2
    Dernier message: 04/05/2009, 09h36
  3. [WebServices][gSoap] Client/serveur
    Par youp_db dans le forum C++/CLI
    Réponses: 3
    Dernier message: 23/11/2007, 10h42
  4. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 17h58
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 16h46

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