Après avoir présenté Dropwizard dans le précédent billet de la série, dont la lecture est un préalable, place aux travaux pratiques.
Cet article est consacré au développement d’un service de consultation temps-réel des horaires du métro parisien avec Dropwizard.
L’ensemble du projet est disponible sur GitHub.
L’interface RESTful du service est la suivante :
*Requête* :
GET /trafic-ratp/metro/**:numero_ligne**/**:nom_station**/**:sens**
où :
numero_ligne
est le numéro de la ligne du métronom_station
est le nom de la station de métro pour laquelle on souhaite connaître les prochains passagessens
a 2 valeurs possibles :A
pour Aller ouR
pour Retour
A titre d’exemple, la requête GET /trafic-ratp/metro/14/pyramides/A
restitue la liste des prochains passages de rames de métro de la station Pyramides, sur la ligne 14 en direction de Saint-Lazare.
*Réponse* :
Le format de la réponse, au format JSON, contient une liste des prochains passages d’une rame dont voici un exemple :
Structure de l’application
Architecture
Les différents composants constituant l’application sont représentés dans le schéma ci-dessous :
###Configuration de l’application
Le fichier de configuration de l’application trafic-ratp.yml
est décrit au format YAML. On externalise en particulier le paramètre applicatif urlRatp
, l’URL du portail de la RATP.
Le fichier de configuration pourrait être réduit au minimum. Il est évidemment possible de surcharger la centaine de paramètres par défaut, dont le port d’écoute du conteneur Jetty par exemple (port 8080
par défaut).
La classe TraficRatpConfiguration
est le gestionnaire de configuration de l’application. C’est par ce biais que l’on accède aux paramètres applicatifs.
Objet métier Rame
L’objet métier Rame.java
modélise l’état du passage d’une rame de métro. Il possède deux propriétés : la direction et la durée d’attente.
Ressource TraficRatpResource
La ressource (au sens REST du terme) implémente le point de terminaison du service JAX-RS. La récupération des informations sur le trafic consiste à interroger le portail ratp.fr puis à extraire les informations utiles en utilisant la technique du web scraping. La librairie jsoup est utilisée à cet effet.
On récupère les 3 paramètres ligne
, station
et sens
dans le nom de la ressource.
Noter que l’on a choisit de poser des contraintes en utilisant des expressions régulières au niveau de l’annotation @Path
. Le paramètre sens
par exemple n’a que 2 valeurs possibles : A
ou R
.
Si l’expression régulière est fausse, le code statut HTTP 404
est retourné, ce qui est logique puisqu’on considère que la ressource n’existerait pas dans ce cas.
Malheureusement, la validation des paramètres de méthode par annotation (@Valid
) ne fonctionne pas avec Dropwizard 0.7.x (qui intègre Jersey 1.x). Il faudra attendre une version compatible avec Jersey 2.x).
Exception mapper IOExceptionMapper
Cette classe permet de traiter l’exception IOException
, lorsqu’elle est levée pendant l’interrogation du portail ratp.fr, sous la forme d’une réponse HTTP 500
avec une charge utile au format JSON contenant le message d’erreur technique.
Health checker RatpHealthChecker
Le test de disponibilité d’une ressource vitale de l’application consiste à s’assurer de la disponibilité du portail RATP (le test, basique, n’a qu’une valeur pédagogique).
Le “bilan de santé” de l’application est consultable par simple interrogation de la ressource GET /healthcheck?pretty=true
dont voici la réponse lorsque le système est opérationnel :
Classe application TraficRatpApplication
Il s’agit de la classe main
assemblant le tout, responsable du démarrage de l’application (enregistrement des ressources, exception mappers, configuration, health checkers).
Construction et exécution
Récupérer le code source du projet sur GitHub :
puis construire le projet Maven (fabrique l’unité de déploiement trafic-ratp-1.0.0-SNAPSHOT.jar
) :
Pour démarrer le service, exécuter la commande :
On utilisera cURL en association avec l’utilitaire jq
pour requêter le service et formater la sortie standard.
- prochains passages du métro ligne 14 / Station Pyramides / Direction Saint-Lazare :
- prochains passages du métro ligne 14 / Station Pyramides / Direction Olympiades :
Le prochain billet de la série sera consacré au déploiement d’un microservice Dropwizard via Docker.