Tutoriel: Création d`un Web service en C++ avec
Transcription
Tutoriel: Création d`un Web service en C++ avec
Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework Gaël de Chalendar CEA LIST / LIC2M Journée de Présentation des Technologies WebContent INSTN 14/12/2009 Plan Présentation de gsoap Architecture de WebContentC++Framework Tutoriel Présentation de gsoap Open source sous licences GPL et gsoap Public Licence (type BSD). De plus, une licence commerciale est disponible. Pour Windows et Linux. Fournit des outils pour créer des Web services utilisant SOAP/XML avec des clients/serveurs C ou C++. L'utilisation des outils gsoap est assez complexe WebContentC++Framework simplifie le développement de Web services en C++ Architecture pour créer des serveurs multithread performants Bibliothèques pour traiter des documents WebContent Bibliothèques facilitant l'interfaçage avec des applications existantes Architecture de WebContentC++Framework Différents paramètres influent sur le .h généré Un processus principal n threads qui écoutent chacun sur un port (1 par service) .h “annoté”. - Types complexes définis dans les XSD déclarés dans le .wsdl sous p threads de forme de classe. - Structures de données des traitement en paramètres des opérations. - Prototypes de fonctions définissant les opérations des fonction des différents services. requêtes reçues Non compilable directement par gcc/g++ !! Architecture Application dépendante de gsoap au minimum : couplage faible. Serveur multi-thread (gsoap est thread-safe) Utilisation d'une Factory (singleton) pour gérer les instantiations d'objet : Objets instantiables identifiés par un ID unique sous forme de string Objets instantiables “enregistrés” auprès de la Factory au lancement de l'application. Création d'une nouvelle instance en passant l'ID de l'objet à la Factory. Utilisation du Design Pattern Bridge pour découpler interfaces et implémentations Les classes d'interface délèguent les appels de fonctions à leur objet membre, pointeur vers une implémentation abstraite. abstraite. Les méthodes publiques de l'implémentation abstraite délèguent l'appel aux fonctions virtuelles pures, implémentées par les classes concrètes dérivées. Architecture Un service WebContent se décompose en plusieurs niveaux: Niveau gsoap : Implémentation des fonctions prototypées par soapcpp2. Instantiation du module soap associé au service à l'aide de son ID. Instantiation de la structure du paramètre de sortie si nécessaire. Niveau soap : Conversion des paramètres “typées gsoap” en types indépendants de gsoap. Instantiation du module core associé au service à l'aide de son ID. Niveau core : Interface entre le serveur SOAP et la couche Métier (e.g. LIMA). Peut faire appel à une couche intermédiaire dans certains cas (e.g. Si le paramètre en entrée est un document XML formatté selon le modèle d'échange WebContent). Appel des fonctions métier. Niveaux intermédiaires selon les services (parseur XML ...). Niveau métier : Exécute la requête et retourne si besoin est les résultats. Cas particulier de la gestion des documents XML au format WebContent : L'API générée par gsoap à partir des WSDL est assez complexe à manipuler Pour un document de type WebContent, le parcours du document sous forme d'objet est moins aisé que sous forme XML native (string). Conversion de l'objet de type Document en XML Utilisation d'un parser XML SAX / DOM par événements pour le parcours du document XML. Contenu de la Distribution (LGPL) https://gna.org/projects/thewebcontent/ Bibliothèque common Bibliothèques génériques pour Factories: instanciation à la demande d'objets nommés Traitement du XML Gestion des threads Gestion du RDF Gestion des fichiers de configuration Implémentations par défaut XML (tinyxml) Threads (pthread) RDF (redland) Config Contenu de la Distribution (LGPL) https://gna.org/projects/thewebcontent/ Gsoap-copy (Copie de gsoap-2.7.12) Accès au nom du service Accès au WSDL du service Autres modifications pour l'implémentation du serveur multithread soapserver et webcontentserver Implémentation du serveur multithread Support du SSL (authentification par certificat) Services stateless ET statefull FASTCGI possible Contenu de la Distribution (LGPL) https://gna.org/projects/thewebcontent/ webcontentlimaservices Partie LGPL de l'implémentation des services du CEA LIST Exemples de traitement du format WebContent qwebserviceclient Un client de Web services pratique pour tester les services Interface graphique en Qt (C++) Tutoriel Hypothèse: on dispose d'une application d'annotation d'entités nommées capable d'annoter les noms des membres de l'équipe de France de rugby de l'automne 2009 Cette bibliothèque possède une fonction analyse qui Prend un texte (std::string) en entrée Renvoie en sortie la liste des positions/longueurs des noms reconnus Nous allons développer un service WebContent qui Instancie l'interface Analyser Prend en entrée un document WebContent Rend en sortie le même document enrichi d'annotations Les codes de la bibliothèque et du service sont disponibles dans la distribution Initialisation (1) Installer les prérequis (redland, redland-devel,...) Télécharger WebContentC++Framework svn co http://svn.gna.org/svn/thewebcontent/trunk/WebContentC++Framework Télécharger le modèle http://weblab-project.org/core/devKit2.1/schemas/schemas.zip Déployer l'archive schemas.zip dans WebContentC++Framework/ Sources/webcontentlimaservices/src/wclimaservices/soap/wsdl Modifier setenv.sh pour affecter le chemin du dossier de téléchargement à la variable WCCPP_HOME Définir les variables d'environnement: source setenv.sh Construire common: cd Sources/common ./cbuild.sh À ne faire qu'une fois Initialisation (2) Installer gsoap-copy cd Sources/gsoap-copy ./cbuild.sh Construire soapserver cd Sources/soapserver ./cbuild.sh Construire webcontentserver cd Sources/webcontentserver ./cbuild.sh Construire webcontentconfiglimalibs: cd Sources/webcontentconfiglimalibs ./cbuild.sh À ne faire qu'une fois L'Application à Publier en tant que WS Construire wccppneetutorial cd wccppneetutorial ./cbuild.sh std::map< int, int > WCCPPNEETutorial::analyse(const std::string& text) { std::map< int, int > result; std::vector<std::string> entities; // here the other player names entities.push_back("Maxime Médard"); entities.push_back("Damien Traille"); std::vector<std::string>::const_iterator eit, eit_end; eit = entities.begin(); eit_end = entities.end(); for (; eit != eit_end; eit++) { const std::string& player = *eit; int position = text.find(player); while (position != std::string::npos) { result.insert(std::make_pair<int,int>(position, position+player.size())); position = text.find(player, position+1); } } return result; } Fonctionnement du Web service Construction du Web Service Éditer Makefile.gsoap dans WebContentC+ +Framework/Sources/webcontentlimaservices/src/wclimaservices/s oap pour ne conserver que NamedEntitiesExtractionTutorial dans la variable WSDL_LIST Construire webcontentlimaservices: cd Sources/webcontentlimaservices ./cbuild.sh Dernières Étapes Création des liens cd dist mkdir implementations cd implementations ln -s ../lib/libwccpppthreadimpl.so ln -s ../lib/libwccpptinyxmlimpl.so cd .. À ne faire qu'une fois mkdir services cd services ln -s ../lib/libnamedentitiesextractiontutorialservice.so Configuration du Service Edit services.conf configuration file set service-libs-path create or edit the NamedEntitiesExtractiontutorialAnalyserSOAPBindingService map <group name="services-global-config"> <param key="service-libs-path" value="...WebContentC++Framework/dist/lib" /> <list name="active-services"> <item value="NamedEntitiesExtractionTutorialAnalyserSOAPBindingService" /> </list> </group> <group name="services-config"> <!-- name : serviceName --> <map name="NamedEntitiesExtractionTutorialAnalyserSOAPBindingService"> <entry key="config-group" value="errorcodes-config" /> <entry key="lib-name" value="libnamedentitiesextractiontutorialservice.so" /> <entry key="implID" value="Default" /> <entry key="port" value="10001" /> <entry key="use-session" value="true" /> <entry key="session-timeout" value="5000000" /> </map> </group> Lancement du Serveur Start webcontentserver [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 [2009-12-10 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] 16:15:03] ******************************* Reading server configuration : ******************************* Nb. processing threads : 30 Server read timeout : 60 Server send timeout : 60 Max. pending requests : 100 Bind hostname : localhost Use SSL : no ******************************* [2009-12-10 16:15:03] [2009-12-10 16:15:03] ********************************* [2009-12-10 16:15:03] Reading services configuration : [2009-12-10 16:15:03] ********************************* [2009-12-10 16:15:03] Services Library path : '/home/gael/Projets/WebContent/WorkshopExterne/WebContentC++Frameworktutorial/WebContentC++Framework/dist/lib' [2009-12-10 16:15:03] - NamedEntitiesExtractionTutorialAnalyserSOAPBindingService : Port -> '10001' - ImplID -> 'Default' lib. name -> 'libnamedentitiesextractiontutorialservice.so' [2009-12-10 16:15:03] [2009-12-10 16:15:03] ********************************* [2009-12-10 16:15:03] [2009-12-10 16:15:03] *************************** [2009-12-10 16:15:03] Starting active services : [2009-12-10 16:15:03] *************************** [2009-12-10 16:15:03] Service 'NamedEntitiesExtractionTutorialAnalyserSOAPBindingService' =>[2009-12-10 16:15:03] Use session cookie : true - Session timeout : 5000000 [2009-12-10 16:15:03] --> Load [2009-12-10 16:15:03] [OK] [2009-12-10 16:15:03] --> Instantiate [2009-12-10 16:15:03] [OK] [2009-12-10 16:15:03] --> Bind to port 10001 [2009-12-10 16:15:03] [OK] [2009-12-10 16:15:03] [2009-12-10 16:15:03] *************************** [2009-12-10 16:15:03] .: Server up and running... :. Appel du Service