Académique Documents
Professionnel Documents
Culture Documents
Les Services Web en Java
Les Services Web en Java
Bienvenue dans le didacticiel des services Web reposants en Java. REST est l'acronyme
de REpresentational State Transfer . REST est un style architectural pour le
développement d'applications accessibles sur le réseau. Le style architectural REST a
été mis en lumière par Roy Fielding dans sa thèse de doctorat en 2000.
Services Web reposants
Les services Web reposants sont une architecture client-serveur sans état dans
laquelle les services Web sont des ressources et peuvent être identifiés par leurs URI.
Les applications clientes REST peuvent utiliser les méthodes HTTP GET/POST pour
appeler les services Web Restful. REST ne spécifie aucun protocole spécifique à utiliser,
mais dans presque tous les cas, il est utilisé sur HTTP/HTTPS. Comparés aux services
Web SOAP, ils sont légers et ne suivent aucune norme. Nous pouvons utiliser XML,
JSON, texte ou tout autre type de données pour la demande et la réponse.
API de services Web RESTful Java
L'API Java pour les services Web RESTful (JAX-RS) est l'API Java permettant de créer
des services Web REST. JAX-RS utilise des annotations pour simplifier le développement
et le déploiement de services Web. JAX-RS fait partie du JDK, vous n'avez donc pas
besoin d'inclure quoi que ce soit pour utiliser ses annotations.
Annotations de services Web reposants
Voyons à quel point il est facile de créer un service Web Restful en utilisant Jersey puis
RESTEasy. Nous allons exposer les méthodes suivantes sur HTTP et utiliser l'extension
Chrome Postman pour les tester.
URI Méthode HTTP Description
Regardons les dépendances de Jersey que nous avons dans le fichier pom.xml.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.o
<modelVersion>4.0.0</modelVersion>
<groupId>JAXRS-Example</groupId>
<artifactId>JAXRS-Example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Nous ne sommes pas obligés d'ajouter des dépendances jersey-client, mais si vous
écrivez un programme Java pour invoquer un service Web REST à l'aide de Jersey, cela
est obligatoire. Examinons maintenant le descripteur de déploiement pour savoir
comment configurer Jersey pour créer notre application Web.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://
<display-name>JAXRS-Example</display-name>
C'est tout ce qu'il faut pour brancher Jersey dans notre application Web, dans notre
code Java, nous utiliserons les annotations JAX-RS. Notez la valeur du paramètre init
com.sun.jersey.config.property.packages pour fournir le package qui sera analysé à la
recherche de ressources et de méthodes de service Web.
Exemple de classes de modèles REST
Tout d'abord, nous allons créer deux beans modèles - Person pour nos données
d'application et Response pour envoyer une réponse aux systèmes clients. Puisque nous
enverrons une réponse XML, les beans doivent être annotés avec @XmlRootElement ,
nous avons donc cette classe.
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name="person")
public class Person {
private String name;
private int age;
private int id;
@Override
public String toString(){
return id+"::"+name+"::"+age;
}
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Response {
Basé sur notre structure d'URI, voici l'interface de service et son code d'implémentation.
package com.journaldev.jaxrs.service;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
package com.journaldev.jaxrs.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
@Path("/person")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class PersonServiceImpl implements PersonService {
@Override
@POST
@Path("/add")
public Response addPerson(Person p) {
Response response = new Response();
if(persons.get(p.getId()) != null){
response.setStatus(false);
response.setMessage("Person Already Exists");
return response;
}
persons.put(p.getId(), p);
response.setStatus(true);
response.setMessage("Person created successfully");
return response;
}
@Override
@GET
@Path("/{id}/delete")
public Response deletePerson(@PathParam("id") int id) {
Response response = new Response();
if(persons.get(id) == null){
response.setStatus(false);
response.setMessage("Person Doesn't Exists");
return response;
}
persons.remove(id);
response.setStatus(true);
response.setMessage("Person deleted successfully");
return response;
}
@Override
@GET
@Path("/{id}/get")
public Person getPerson(@PathParam("id") int id) {
return persons.get(id);
}
@GET
@Path("/{id}/getDummy")
public Person getDummyPerson(@PathParam("id") int id) {
Person p = new Person();
p.setAge(99);
p.setName("Dummy");
p.setId(id);
return p;
}
@Override
@GET
@Path("/getAll")
public Person[] getAllPersons() {
Set<Integer> ids = persons.keySet();
Person[] p = new Person[ids.size()];
int i=0;
for(Integer id : ids){
p[i] = persons.get(id);
i++;
}
return p;
}
La plupart du code est explicite, prenez le temps de vous familiariser avec les
annotations JAX- RS @Path , @PathParam , @POST , @GET et @Consumes . @Produces
Test de services Web reposants
C'est ça. Notre service Web est prêt, exportez-le simplement en tant que fichier WAR et
placez-le dans le répertoire des applications Web Tomcat ou déployez-le dans tout autre
conteneur de votre choix. Vous trouverez ci-dessous quelques-uns des tests effectués à
l'aide de l'extension Chrome Postman pour ce service Web. Notez que nous devons
fournir les valeurs Accept et Content-Type en tant que "application/xml" dans l'en-tête
de la demande, comme indiqué dans l'image ci-dessous.
getDummy
ajouter
obtenir
Avoir tout
supprimer
C'est tout pour créer des services Web à l'aide de l'implémentation Jersey JAX-RS.
Comme vous pouvez le constater, la majeure partie du code utilise des annotations JAX-
RS et Jersey est connecté via le descripteur de déploiement et les dépendances.
Exemple de services Web RESTEasy RESTful
Nous utiliserons toute la logique métier développée dans le projet Jersey, mais plutôt
que d'apporter des modifications au même projet, j'ai créé un nouveau projet. Créez un
projet Web dynamique et convertissez-le en projet Maven. Copiez ensuite toutes les
classes Java - Person, Response, PersonService et PersonServiceImpl. Vous trouverez
ci-dessous le projet final une fois que nous aurons terminé avec tous les changements.
Vous trouverez ci-dessous le fichier web.xml dans lequel nous configurons le servlet
Resteasy.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://
<display-name>JAXRS-Example-RestEasy</display-name>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.journaldev.jaxrs.resteasy.app.MyApp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Remarquez le init-param où nous fournissons la MyApp classe comme valeur, ici nous
étendons javax.ws.rs.core.Application la classe comme indiqué ci-dessous.
package com.journaldev.jaxrs.resteasy.app;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.journaldev.jaxrs.service.PersonServiceImpl;
public MyApp() {
singletons.add(new PersonServiceImpl());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Test des services Web RESTEasy
C'est ça. Notre service Web est prêt avec l'implémentation RESTEasy JAX-RS. Vous
trouverez ci-dessous quelques-uns des résultats du test d'extension Chrome Postman.
getDummy
ajouter
obtenir
C'est tout pour le didacticiel sur les services Web reposants , j'espère que vous avez
appris les annotations JAX-RS et compris les avantages d'avoir une API standard qui
nous a aidés à réutiliser le code et à passer de Jersey à RESTEasy si facilement.