Exercices TP4 Creation Service REST Full avec Netbeans et JavaEE Web Services
Télécharger PDFServices Web RESTful : Un Guide Pratique avec Netbeans
Ce guide explore la création d'un service REST simple, capable de servir des documents XML pour représenter des entités comme des personnes. L'URI (Uniform Resource Identifier) pour chaque personne est structurée de manière à inclure un identifiant unique (ID) pour la récupération de sa représentation XML.
Création d'un service REST sous Netbeans
Pour commencer, créez un projet d'application web dans Netbeans, nommé par exemple « cours-rest ». Netbeans facilite la création de services REST. Pour cela, suivez ces étapes :
- Créez un nouveau fichier et sélectionnez « RESTful webservice from pattern » dans l'onglet « Web Services ».
- Choisissez le pattern « Simple root resource ».
- Spécifiez la classe qui hébergera le service. Par exemple, utilisez « RestS » comme chemin d'accès pour cette ressource et conservez les valeurs par défaut pour les autres paramètres.
Netbeans génère alors une classe, comme RestClass, pour ce service REST. Analysons cette classe.
Exemple : Un premier service REST – RestClass.java
@Path("RestS")
public class RestClass {
@Context
private UriInfo context;
@GET
@Produces("application/xml")
public String getXml() {
// contenu de la méthode
}
@PUT
@Consumes("application/xml")
public void putXml(String content) {
// contenu de la méthode
}
}Observations importantes concernant cette classe :
- Il s'agit d'une classe Java standard, sans extension particulière ni implémentation d'interface spécifique. Elle contient un constructeur vide par défaut. L'annotation
@Path("RestS")est cruciale, car elle désigne cette classe comme un service REST. - La classe inclut deux méthodes (leur nom n'a pas d'importance), annotées par
@GETet@PUT. Ces annotations correspondent aux méthodes HTTP. Une requête HTTP de type GET invoquera la méthode annotée@GET, et de même pour une requête PUT. - Les annotations
@Consumeset@Producesdéfinissent le format des données échangées (reçues ou émises) par ces méthodes, ici, le format XML.
Modifions la méthode getXml() comme suit :
@GET
@Produces("application/xml")
public String getXml() {
return "<bonjour> MMI2 </bonjour>";
}Selon la version de Netbeans, deux approches sont possibles pour la configuration :
- Un fichier
web.xmlest généré, déclarant une servlet qui gère le service web REST. Dans ce cas, vous pouvez modifier la balise<url-pattern>pour qu'elle pointe vers/*. - La classe
ApplicationConfig.javaest générée dans le package « source package ». Cette classe, agissant comme un client, permet d'accéder à la classe du service REST (iciRestClass.java). OuvrezApplicationConfig.javaet vous trouverez le code qui stipule :@javax.ws.rs.ApplicationPath("webresources"), ce qui définit le chemin d'accès aux ressources du service web.
En général, les URI des ressources (méthodes) de notre service REST (implémentées dans la classe RestClass.java) suivent cette structure : http://[nom-serveur]:[numéroPort]/[nom-projet]/webresources/[path-class]/[path-ressource]. Pour notre exemple, cela pourrait être : http://localhost:8080/cours-rest/webresources/RestS.
Pour tester votre service :
- Déployez le projet. Assurez-vous que le serveur (par exemple, Glassfish) est démarré.
- Ouvrez un navigateur web et accédez à l'URL correspondante à la méthode
getXml(). Vous devriez voir le message<bonjour> MMI2 </bonjour>.
Ajoutons maintenant une nouvelle méthode pour gérer les requêtes avec des paramètres :
@GET
@Path("{id}")
@Produces("application/xml")
public String getXmlWithParams(@PathParam("id") String id, @DefaultValue("all") @HeaderParam("name") String name) {
System.out.println(id);
System.out.println(name);
return "<bonjour> " + id + " :MMI2 de la part de " + name + " </bonjour>";
}Après avoir redéployé le projet, vous pouvez tester cette nouvelle méthode :
- Accédez à l'URL correspondant à
getXmlWithParams(...)(par exemple, en ajoutant un ID après le chemin de la ressource, commehttp://localhost:8080/cours-rest/webresources/RestS/23). Le message<bonjour> 23 :MMI2 de la part de all </bonjour>devrait s'afficher dans votre navigateur. - Pour envoyer des paramètres au niveau de l'en-tête de la requête, nous pouvons utiliser plusieurs outils, à savoir Postman, Insomnia, ou la commande
curl.curlest un outil en ligne de commande pour construire des requêtes HTTP. Après l'installation de curl, depuis une invite de commande, saisissez la commande suivante :curl -X GET -H "name: Toto" http://localhost:8080/cours-rest/webresources/RestS/23. - À partir d'un navigateur web, vous pouvez afficher le contrat de description WADL via l'URL correspondante à votre service, par exemple :
http://localhost:8080/cours-rest/webresources/application.wadl.
Création d'un modèle
Notre service aura besoin de manipuler des objets "Personne". Ajoutons une classe Personne à notre projet, avec des annotations JAXB.
Exemple : Classe Personne pour notre service REST
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Personne implements Serializable {
@XmlAttribute
private long id;
private String nom, prenom;
private int age;
// Ajout des getters et setters
}Cette classe est une POJO (Plain Old Java Object) standard, enrichie d'annotations JAXB pour faciliter sa conversion en XML et inversement.
Modification du service REST
Modifions à présent notre service REST pour prendre en compte la classe Personne.
Exemple : Version modifiée de RestClass.java
@Path("RestS")
public class RestClass {
@GET
@Path("person/{id}")
@Produces("application/xml")
public Personne getPerson(@PathParam("id") long id) {
Personne p = new Personne();
p.setId(id);
p.setNom("Ahmed");
p.setPrenom("Toto");
p.setAge(32);
return p;
}
}Les modifications par rapport à la classe originale incluent :
- **Annotation @Path modifiée :** La valeur de l'annotation
@Pathest maintenant/person/{id}. Cela signifie qu'une URL de la forme/person/15sera acceptée, et un paramètre de cheminidsera créé pour cette requête, avec la valeur 15. - **Méthode @GET améliorée :** Notre méthode
@GETa changé de nom, ce qui n'a pas d'importance, vu que ce qui compte c'est son annotation et non pas son nom. En revanche, son type de retour est maintenantPersonneplutôt queString. Elle prend un paramètre, qui est annoté par@PathParam("id"). Cette annotation signifie que la valeur du paramètre de cette méthode correspondra à la valeur du paramètre de cheminid. - **Corps de la méthode :** Enfin, dans le corps de cette méthode, une instance de
Personneest créée, en fixant la valeur de sonidà la valeur passée en paramètre. Les autres champs sont classiques. On imagine qu'à terme, cette personne sera lue depuis une base de données. L'objet retourné par cette méthode est simplementp.
Le fait que cette méthode soit annotée par @Produces("application/xml"), et que notre classe Personne porte des annotations JAXB, va automatiquement déclencher le marshalling de cet objet en XML, par JAXB.
Enfin, pour l'utiliser, il suffit de faire une requête à l'aide d'un navigateur standard sur l'URL : http://localhost:8008/cours-rest/webresources/RestS/person/15. On reçoit le document XML suivant en réponse à cette requête.
Exemple : Document XML servi
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personne id="15">
<nom>ahmed</nom>
<prenom>toto</prenom>
<age>15</age>
</personne>Ce document XML confirme qu'il s'agit bien de notre objet Personne, marshallé en XML par JAXB.
FAQ
- Qu'est-ce qu'un service RESTful ?
- Un service RESTful (Representational State Transfer) est une architecture de système distribué qui utilise les principes du protocole HTTP (comme GET, POST, PUT, DELETE) pour la communication entre systèmes. Il se concentre sur les ressources et leurs représentations (souvent JSON ou XML).
- Pourquoi utiliser JAXB pour les services REST qui renvoient du XML ?
- JAXB (Java Architecture for XML Binding) facilite la conversion automatique d'objets Java en XML (marshalling) et vice-versa (unmarshalling). En l'intégrant à un service REST produisant du XML, il simplifie grandement la gestion de la sérialisation des données.
- Quels outils peut-on utiliser pour tester un service RESTful ?
- Pour tester un service RESTful, vous pouvez utiliser un navigateur web pour les requêtes GET simples, ou des outils plus avancés comme Postman, Insomnia, ou la ligne de commande
curlpour gérer des requêtes plus complexes incluant des en-têtes ou différents types de corps de requête (POST, PUT, DELETE).