I. Introduction

Il y a quelques semaines, je vous avais proposé un rapide article intitulé "Développer un Web Service avec JAX-WS et le tester avec SOAPUI". Sans surprise, il expliquait comment écrire un Web Service mais à l'ancienne, si on peut dire, en utilisant SOAP (Simple Object Access Protocol) et la bibliothèque JAX-WS.

Aujourd'hui, je vous présente (de nouveau) comment écrire un Web Service équivalent en Java, mais en utilisant REST (REpresentational State Transfer) et le format Json (JavaScript Object Notation). Nous verrons qu'il est très facile de créer ses premiers Web Services REST (Json) à l'aide de la bibliotèque Jackson, en suivant quelques étapes simples.

Alors pourquoi REST ? Pourquoi JSON ? Les appels REST, surtout dans le cadre des Web Services, sont très sensiblement revenus à la mode depuis un ou deux ans. Le format JSON a, quant à lui, le vent en poupe. Il est simple et léger, ce qui qui a valu l'affection de l'industrie, pour les Web Services mais aussi pour AJAX. Pour compléter ce portrait, nous allons utiliser le serveur Jetty, qui est un des serveurs Web en Java les plus légers, en l'embarquant dans le projet.

I-A. À propos

Pour écrire ce document, je me suis aidé d'un article tiré de l'excelent blog de Yan Bonnel, dans lequel il retrace sa participation aux selections de Code Story.

Découvrir une technologie n'est pas chose facile. En aborder plusieurs d'un coup l'est encore moins. Partant de ce constat, cet article a été écrit pour aller à l'essentiel. Les points importants sont présentés dans le corps de l'article et les éléments secondaires sont expliqués en annexes.

I-B. Avant de commencer

Pour écrire ce tutoriel, j'ai utilisé les éléments suivants :

  • Java JDK 1.6.0_24-b07 ;
  • Eclipse Indigo 3.7 JEE 64b ;
  • Maven 3.0.3 ;
  • TODO

II. Découverte du projet d'exemple

II-A. Télécharger, installer et importer le projet d'exemple

Pour commencer, je vous propose de télécharger le fichier Zip "fibowebapp2.zip", contenant un projet Java-Maven d'exemple (une miniwebapp) qui va nous servir de support pour les fonctionnalités présentées dans la suite de cet article. Je précise que c'est exactement le même fichier de départ que je vous avais proposé dans mon précédent article sur les Web Services.

Compilez le projet d'exemple et importez-le dans Eclipse (comme expliqué dans le tutoriel "Importer un projet Maven dans Eclipse en 5 minutes"Importer un projet Maven dans Eclipse en 5 minutes) ou dans l'IDE de votre choix.

Pour suivre ce tutoriel, vous pouvez vous contenter de lire les codes proposés ci-dessous (codes complets en annexes) et de faire confiance aux captures d'écran.

II-B. Ce que fait déjà le projet d'exemple

Le projet d'exemple est une petite webapp permettant de calculer plusieurs fonctions mathématiques célèbres. Cette application Web n'a rien de très complexe et ce sont surtout les fonctions de calcul de la suite de Fibonacci (exemple classsique) qui vont nous servir dans la suite de ce tutoriel.

Image non disponible
Suite de Fibonacci pour le rang 14

Comme on le voitr sur la capture d'écran, la webapp calcule la valeur du membre de la suite de Fibonacci pour un rang donné. Elle calcule aussi les membres de rangs inférieurs, ce qui permet d'afficher une liste intéressante. En outre, la webapp utilise deux méthodes de calcul. La première met en œuvre un algorithme récursif lent, mais qui donne une valeur exacte. La seconde se sert d'une fonction mathématique rapide dont la justesse des résultats dépend de la précision des constantes internes utilisées. La dernière colonne du tableau de résultat fait apparaitre les erreurs d'approximation.

Image non disponible
Approximations dès le rang 62

Cette petite Webapp a été présentée en détail dans l'article "De jolies URL dans vos applications Web JSF avec Pretty Faces".

Pour réaliser le calcul, la Webapp utilise le service "FiboService" :

FiboService.java
Sélectionnez

public class FiboService {

   // singleton
  private static FiboService instance;
  public static synchronized FiboService getInstance() {
       if (instance == null) {
           instance = new FiboService();
       }
       return instance;
   }

   // Calcul recursif mais exact
   public Long calculerFibonacci(Integer n) {
       ...
   }

   // Calcul direct, mais approximatif
   public Long calculerApproximationfibonacci(Integer n) {
       ...
   }

  ...

Quant au bean "FiboBean" qui "manage" la page, il lance les appels qu'il faut pour remplir le bean de résultat "FiboResult" :

FiboResult.java
Sélectionnez

public class FiboResult {

   private Integer rang;
   private Long valeurExacte;
   private Long valeurApproximative;
   private Long approximation;

   public FiboResult(Integer rang, Long valeurExacte, Long valeurApproximative) {
       this.rang = rang;
       this.valeurExacte = valeurExacte;
       this.valeurApproximative = valeurApproximative;
       this.approximation = Math.abs(valeurExacte - valeurApproximative);
   }

   ...
FiboBean.java
Sélectionnez

public class FiboBean {

   private FiboService fiboService = FiboService.getInstance();
   private List<FiboResult> valeurs;
   ...

   public void calculer() {

       valeurs = new ArrayList<FiboResult>(rang);
       for (int i = 1; i <= rang; i++) {
           final FiboResult fiboResult = calculerFiboResult(i);
           valeurs.add(fiboResult);
       }

       Long valeur = fiboService.calculerFibonacci(rang);
   }

   private FiboResult calculerFiboResult(Integer rang) {
       Long valeurExacte = fiboService.calculerFibonacci(rang);
       Long valeurApproximative = fiboService.calculerApproximationfibonacci(rang);
       FiboResult fiboResult = new FiboResult(rang, valeurExacte, valeurApproximative);
       return fiboResult;
   }

   ...

III. Action

III-A. Maven

III-B. Le format JSon

III-C. Création du Web service REST

III-D. Tester le Web service

III-D. Les tests avec JUnit

III-F. Des retours plus complexes

IV. Conclusions

V. Remerciements

VI. Annexes

VI-A. Liens

VI-B. Liens personnels

VI-C. Les fichiers importants en entier