Tutoriel Java RESTful Web Service pour les débutants

View more Tutorials:

1- Introduction

Le document est basé sur: 
  • Eclipse 4.6 (NEON).

  • Jersey

Si vous êtes un débutant avec RESTful Web Service , vous devez consacrer 10 minutes pour savoir ce qui est RESTful Web service avant de commencer avec une application Java RESTful serivce.

Vous pouvez voir "Qu'est-ce que le service web RESTful" ici:

2- Qu'est-ce que Jersey?

Jersey est une plate-forme Java open-source pour vous aider à développer des applications RESTful Web service et les applications Client connexes. Jersey exécute les spécifications JSR 311.
Jersey fournit des bibliothèques de mettre en œuvre RESTful web service dans le conteneur de servlet (Servlet Container).

Au sommet de Jersey fournit un serveur de servlet, il est utilisé pour balayer la classe prédéfinie de distinguer les ressources RESTful. Dans ce servlet web.xml doit enregistrer avec votre application.

Jersey fournit également des bibliothèques clientes pour communiquer avec RESTful web service.
Voici la structure de liaison des ressources proposées par  Jersey.
Dans le quel  com.sun.jersey.spi.container.servlet.ServletContainer, Un servlet est fourni par  JERSEY, et doit être déclaré dans  web.xml.

3- Créez l'application Maven

Sur Eclipse sélectionne :
  • File/New/Other..
Entrez:
  • Group Id: org.o7planning
  • Artifact Id: HelloRESTful

4- Déclarez maven et web.xml

Vous devez déclarer la bibliothèque JERSEY et Servlet dans le pom.xml:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/maven-v4_0_0.xsd">
   
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.o7planning</groupId>
    <artifactId>HelloRESTful</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>HelloRESTful Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/asm/asm -->
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.19.2</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>HelloRESTful</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/HelloRESTful</path>
                    <port>8080</port>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>
Déclarer RESTful Servlet - com.sun.jersey.spi.container.servlet.ServletContainer - Un Servlet est fourni par  Jersey REST API.

Vous devez déclarer le  package qui contient votre classe RESTful avec ce  servlet via les paramètre  com.sun.jersey.config.property.packages.

(Notez l'utilisation du  servlet > = 3.0)

 
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>Hello RESTful Service</display-name>

    <servlet>
        <servlet-name>jerseyServlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>org.o7planning.hellorestful</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>  
    </servlet>
    <servlet-mapping>
        <servlet-name>jerseyServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>


</web-app>

5- RESTful Service class

L'étape suivante, vous créez vos classes de service RESTful. L'exemple ci-dessous, la classe WeatherRESTfulService est un service web fournissant des informations météo
WeatherRESTfulService.java
package org.o7planning.hellorestful;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/weather")
public class WeatherRESTfulService {

   private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

   //
   // http://localhost:8080/contextPath/rest/weather/{location}/{date}
   // Example:
   // http://localhost:8080/contextPath/rest/weather/chicago/2016-09-27
   // http://localhost:8080/contextPath/rest/weather/hanoi/2016-09-27
   //
   @Path("{location}/{date}")
   @GET
   @Produces("application/xml")
   public String getWeather_XML(@PathParam("location") String location,//
            @PathParam("date") String dateStr) {
       Date date = null;
       if (dateStr == null || dateStr.length() == 0) {
           date = new Date();
       } else {
           try {
               date = df.parse(dateStr);
           } catch (ParseException e) {
               date = new Date();
           }
       }
       dateStr = df.format(date);

       String[] weathers = new String[] { "Hot", "Rain", "Cold" };
       int i = new Random().nextInt(3);
       String weather = weathers[i];

       return "<weather>"//
               + "<date>" + dateStr + "</date>"//
               + "<location>" + location + "</location>"//
               + "<info>" + weather + "</info>"//
               + "</weather>";
   }

   //
   // http://localhost:8080/contextPath/rest/weather/{location}
   // Example:
   // http://localhost:8080/contextPath/rest/weather/chicago
   // http://localhost:8080/contextPath/rest/weather/hanoi
   //
   @Path("{location}")
   @GET
   @Produces("application/xml")
   public String getWeather_XML(@PathParam("location") String location) {
       return getWeather_XML(location, null);
   }

   //
   // http://localhost:8080/contextPath/rest/weather/{location}/{date}
   // Example:
   // http://localhost:8080/contextPath/rest/weather/chicago/2016-09-27
   // http://localhost:8080/contextPath/rest/weather/hanoi/2016-09-27
   //
   @Path("{location}/{date}")
   @GET
   @Produces("application/json")
   public String getWeather_JSON(@PathParam("location") String location,//
           @PathParam("date") String dateStr) {
     
       Date date = null;
       if (dateStr == null || dateStr.length() == 0) {
           date = new Date();
       } else {
           try {
               date = df.parse(dateStr);
           } catch (ParseException e) {
               date = new Date();
           }
       }
       dateStr = df.format(date);

       String[] weathers = new String[] { "Hot", "Rain", "Cold" };
       int i = new Random().nextInt(3);
       String weather = weathers[i];

       return "{" //
               + "'date': '" + dateStr + "'," //
               + "'location': '" + location + "'," //
               + "'info': '" + weather + "'" //
               + "}";
   }

   //
   // http://localhost:8080/contextPath/rest/weather/{location}
   // Example:
   // http://localhost:8080/contextPath/rest/weather/chicago
   // http://localhost:8080/contextPath/rest/weather/hanoi
   //
   @Path("{location}")
   @GET
   @Produces("application/json")
   public String getWeather_JSON(@PathParam("location") String location) {
       return getWeather_JSON(location, null);
   }

}

6- Exécutez l'application

Configuré pour exécuter l’application.

7- Explain RESTful

Copiez l'URL ci-dessous  et fonctionne sur le navigateur:
Lorsque vous exécutez l'URL ci-dessus, il est équivalent de vous envoyer une demande au serveur:
GET /HelloRESTful/rest/weather/chicago/2016-08-27 HTTP/1.1
Host: localhost:8080
Dans le cas où Request ne précise pas clairement le type de données retournées (type MINE), le type de données retourné sera que la valeur par défaut dépend du service Web.
Les demandes (request) envoyées ne peuvent spécifier le type de données retournées.
GET /HelloRESTful/rest/weather/chicago/2016-08-27 HTTP/1.1
Host: localhost:8080
Accept: application/xml
ou:
GET /HelloRESTful/rest/weather/chicago/2016-08-27 HTTP/1.1
Host: localhost:8080
Accept: application/json
Avec l’exemple ci-dessus, si la demande spécifie que le type de retour est application/json vous aurez des résultats comme illustré ci-dessous :
Pour être en mesure de préciser quel type de déclaration que vous avez besoin d'écrire des applications Clients pour créer les Demande (Request) personnalisé et envoyé au service Web. Cependant, vous pouvez également utiliser les AddOns pour le navigateur pour pouvoir modifier la demande avant de l’envoyer au service RESTful.

RESTClient AddOns est un tel plugin, vous pouvez l’installer sur Firefox ou Chrome. Il vous permet de tester le service web RESTful dans le processus de développement d’application.
Comment fonctionne Jersey RESTful ?
contextPath:
REST Path:

View more Tutorials: