Grails. Vous trouverez une présentation rapide de ce framework dans un article précédent.
Ce framework peut être présenté rapidement comme un pendant de Rails pour Java.
Les principaux avantages de Grails pour implémenter notre émissaire sont :
L'initiation rapide d'une webapp Java
La mise à disposition d'abstractions facilitatrices
Un DSL pour l'exposition rapide de web services REST
Une API simple de lecture/écriture XML
L'intégration native avec du Java si besoin
Nous allons développer un web service REST qui nous permet de récupérer les informations d'un collaborateur présentes dans l'annuaire.
La ressource au sens REST est donc le collaborateur accessible au travers de l'URI suivante :
http://{host}:{port}/rest-app/collaborateur/{collaborateuruid}
La représentation de cette ressource retournée par notre web service REST, pour une requête http de type GET, est un fragment XML (d'autres représentations sont possibles JSON, ...) :
Le web service REST met à profit les codes HTTP :
Status | Description |
200 | Succès, la représentation XML du collaborateur identifié par {collaborateuruid} est dans le body |
404 | Il n'existe pas de collaborateur associé à l'uid {collaborateuruid} |
Maintenant que nous avons défini notre contrat de service nous pouvons rentrer dans le détail de son implémentation.
La structure choisie pour l'émissaire est la suivante :
Nous allons utiliser le DSL REST fournis par Grails qui permet de lier les URI au code des controllers. Sur le schéma précédent le DSL REST est la brique de mapping REST plus la flèche vers le controller.
Ainsi dans le fichier UrlMapping.groovy il faut procéder de la façon suivante :
![](Grails-REST-UrlMapping.png)
Le code ci-dessus défini un certains nombres de mécanismes :
Les requêtes http vers l'URL http://{host}:{port}/rest-app/collaborateur/{collaborateuruid} seront traitées par le controller " collaborateur " (la classe CollaborateurController.groovy).
Chaque méthode http est traitée par une action du controller
Les requêtes GET seront traitées par l'action " getCollaborateur "
La définition d'une variable $collaborateuruid permet de mapper directement cette valeur dans un paramètre (nommé " collaborateuruid ") accessible dans le controller
Regardons maintenant ce que contient le controller Grails en charge du traitement des requêtes.
Comme vous pouvez le voir dans la méthode " generateCollaborateurXMLFragment ", afin de générer le fragment XML du body de la réponse nous utilisons une facilitée offerte par le langage Groovy : les MarkupBuilder. Ce module du langage Groovy s'appuie sur le pattern Builder. Si vous le souhaitez des informations complémentaires sont disponibles ici et ici.
Le controller s'appuie sur un Service Groovy afin de récupérer les informations du collaborateur identifié par le collaborateuruid dans l'annuaire pages blanches. A noter que ce service s'appuie sur le framework Spring LDAP pour implémenter toutes les fonctionnalités d'accès à l'annuaire.
L'injection du service dans le controller se fait via Spring en utilisant le pattern Convention over Configuration afin de simplifier l'écriture.
Il ne nous reste plus qu'à packager et déployer l'application web pour constater avec le navigateur les résultats que nous obtenons :
(A noter qu'un des bénéfices de l'approche REST est que pour le besoin de la démonstration visuelle d'un service en lecture un simple navigateur suffit)
Le cas nominal : Le collaborateuruid donné correspond à un collaborateur dans l'annuaire pages blanches
Le cas d'erreur : Le collaborateuruid donné ne correspond pas à un collaborateur dans l'annuaire pages blanches
Nous venons ici de réaliser rapidement un premier service de notre émissaire. Ce service permet d'accéder en lecture aux informations d'un collaborateur de la société.
Il est désormais envisageable d'ajouter à cet émissaire de nouveaux services résultant d'une étude des besoins des applications clientes de l'annuaire pages blanches.
Du point de vue des applications clientes, un intranet par exemple, l'avantage de l'approche REST est que seul un client http est nécessaire pour récupérer la représentation des ressources. Pour manipuler les représentations des ressources, des parseurs peuvent être requis en plus de ce client http (XML, JSON, ...).
Si vous souhaitez recevoir le code complet de cet exemple et vous faire la main sur les services REST en Grails, demandez le moi à l'adresse suivante : bmagnan@octo.com.