Actualités

[10/09/2014] Les inscriptions au Bargento 2014 sont ouvertes !

Retrouvez tout l’e-commerce autour de Magento le mardi 7 octobre à Paris.

[02/09/2014] Smile Paris déménage

A compter du 30 août 2014, le siège social de Smile emménage dans de nouveaux locaux à Asnières-sur-Seine.

[17/07/2014] Retrouvez la vidéo du Webinar : Etre autonome sur sa communication web

Découvrez la vidéo du webinar Ametys et Smile, pour bénéficier des retours d’expérience de la Ville de Cannes et voir comment la collectivité utilise la solution de gestion de contenu Ametys pour gérer l'ensemble de ses portails web et accroître leur visibilité.

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

JAX-RS, le spécification Java pour implémenter les services REST.

JAX-RS définit un ensemble d'API Java pour le développement de services Web construits selon le style d'architecture REST.

JAX-RS

JAX-RS est la standardisation des services REST en Java. Cette spécification définit un ensemble d'annotations permettant d'exposer des classes java comme service REST. L'intérêt de la standardisation est de ne pas se lier à une implémentation spécifique. Par ailleurs, JAX-RS 1.1 fait dorénavant partit de JEE6.

Annotations

Pour implémenter les services REST, JAX-RS définit un certain nombre d'annotation. On retrouvera principalement :

  • @Path : définit le chemin de la ressource. Cette annotation se place sur la classe et/ou sur la méthode implémentant le service.
  • @GET, @PUT, @POST, @DELETE : définit le verbe implémenté par le service
  • @Produces spécifie le ou les Types MIME de la réponse du service
  • @Consumes : spécifie le ou les Types MIME acceptés en entré du service

Exemple JAX-RS

Voici en exemple d'implémentation de quelques services REST avec JAX-RS :

package fr.smile;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.WebApplicationException;
 
 
@Path("articles")
public class Articles {
   @GET
   @Produces({MediaType.APPLICATION_JSON})
   public List<Article> findAllArticles(){
       List<Article> articles = articleDao.findAll();
       return articles;
   }
 
   @GET
   @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
   @Path("/{article}")
   public Article findArticle(@PathParam("article") String id){
       Article article = articleDao.findById(id);
    if(article ==null){
        throw new WebApplicationException(Status.NOT_FOUND);
    }
       return article;
   }
 
 
   @DELETE
   @Path("/{article}")
   public void deleteArticle(@PathParam("article") String id){
       articleDao.remove(id);
   }
}

Cette classe expose les ressources liste d'article (uniquement GET) et article (GET et DELETE). Explication :

@Path("articles") : L'annotation sur la classe Article définit l'URI de base des services exposés dans cette classe. Chaque méthode peut ensuite redéfinir un sous Path.

Liste des articles : la méthode findAllArticle est annoté avec @GET. Pour récupérer la liste d'article, il faut executer la méthode HTTP GET sur l'URI http://server/articles. L'utilisation de l'annotation @Produces permet de spécifier le format de la réponse en application/json.

Ainsi, GET http://server/articles

Retourne :

[
 
  {"id":"art1","title":"article1","url":"http://server/articles/art1"},
 
 {"id":"art2","title":"article2","url":"http://server/articles/art1"}
 
]

Pour lire l'article "art1", il faut exécuter la méthode GET sur l'URI http://server/articles/art1. Comme @Produces définit 2 types MIME de retour, le retour sera fonction du Header "Accept" de la requete http. Selon l'implementation JAX-RS, il est aussi possible de se baser sur l'extension pour choisir le format. Par exemple http://server/articles/art1.json permet d'obtenir la réponse json.

Pour supprimer l'article "art1", il faut exécuter la méthode DELETE sur l'URI http://server/articles/art1.

Dans cet exemple, les méthodes java retournent des objets et ne s'occupent pas de la conversion en json ou xml. JAX-RS utilise pour cela JAXB pour le marshalling des objets en XML, et des extensions pour les conversions dans les autres formats.

Implémentations

Les principales implémentations de JAX-RS sont :

JAX-RS coté client

JAX-RS se limite à l'implémentation serveur, la spécification ne propose rien du coté client. Il est bien entendu possible d'appeler un service avec l'API HTTP. Mais, une autre solution est possible. En effet, les implémentations Jersey et Resteasy fournissent une API client permettant d'appeler des services REST respectant le standard JAX-RS.

Avec RestEasy, pour récupérer la liste d'article :

....
RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
Articles proxy = (EchoClient)ProxyFactory.create(Articles.class, "http://server/articles");        
List<Article> articles = (List<Article>)proxy.findArticles();

ProxyFactory.create permet de créer un proxy local du service REST. Dans l'exemple, nous utilisons l'implémentation Articles.java, mais l'idéal serait d'utiliser une interface Articles annoté avec JAX-RS et une classe d'implémentation ArticlesImpl. L'interface serait ainsi packagé dans un jar coté client et coté serveur, seul l'implémentation serait coté serveur.

Avec Jersey, pour récupérer l'article art1 :

Client c = Client.create();
WebResource r = c.resource("http://serveur/articles/art1");
Article article = r.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
                   .accept(MediaType.APPLICATION_JSON)
                   .get(Article.class);
Alexis Thaveau
picto

Commentaires

       
Shoun Ichida
Merci pour ces informations.
Pour ceux que ça intéressent il y a un complément sur le wiki de Oracle :
http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features
mercredi 07 avril 2010 @ 21:30
       

       
Pour les personnes habitant en région grenobloise, l'alpes JUG organise une soirée sur ce sujet lundi 26/04.

http://www.alpesjug.fr/?p=258
mardi 27 avril 2010 @ 8:30
       
Ecrire un nouveau commentaire