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