Vous êtes sur la page 1sur 8

Examen Révision Services Web

Exercice 1 : JAX-RS
Etude de cas : Système de suivi des projets

Dans le but d’aider les entreprises de développement à suivre et gérer les projets, on se
propose de mettre en place un service Web leur permettant d’ajouter, consulter les projets, se
renseigner sur leurs date de début et fin ainsi que d’avoir une supervision continue par un chef
de projet.

Un projet possède les informations suivantes : un identifiant, un nom, une description, une
date de début, une date de fin et un Chef de projet .Ce dernier est caractérisé par un matricule
(son identifiant) , un nom et prénom, un numéro de téléphone et un email.

Les ressources REST qui constituent le service web sont présentées ci-dessous.

Soit les descriptions suivantes de l’API REST :

Page 1 sur 8
● Ajout d’un projet

Requête POST /projet

Header Content-Type: application/json

Body {
"id": "1",
"nom": "Application web",
"description": "développement d'une application web avec Spring boot
et Angular",
"dateDebut": "23/10/2021",
"dateFin": "23/10/2022",
"chefProjet": {
"matricule": "matricule123",
"nom": "Mohamed",
"prenom": "Salah",
"numtel": "12345678",
"email": "mohamedsalah@gmail.com"
}}

Réponse Header Content-type : text/plain

Status 201 CREATED / 404 NOT FOUND

Body Projet a été ajouté avec succès

● Récupération de la liste de tous les projets.

Requête GET /projet

Réponse Header Content-Type: application/json

Status 200 OK / 404 NOT FOUND

Body [
{
"id": "1",

Page 2 sur 8
"nom": "Application web",
"description": "développement d'une application web avec Spring
boot and Angular",
"dateDebut": "23/10/2021",
"dateFin": "23/10/2022",
"chefProjet": {
"matricule": "matricule123",
"nom": "Mohamed",
"prenom": "Salah",
"email": "mohamedsalah@gmail.com",
"numtel": "12345678"
}
},
{
"id": "2",
"nom": "Application mobile",
"description": "développement d'une application mobile avec Spring
boot et React Native",
"dateDebut": "01/10/2021",
"dateFin": "01/10/2022",
"chefProjet": {
"matricule": "matricule456",
"nom": "Karim",
"prenom": "Ben Mohamed",
"email": "Karimbenmohamed@gmail.com",
"numtel": "87654321"
}}
]

● Récupération de la liste des projets pour un chef de projet spécifique.

Requête GET /projet?matricule=matricule456

Réponse Header Content-Type: application/json

Status 200 OK / 404 NOT FOUND

Page 3 sur 8
Body [
{
"id": "2",
"nom": "Application mobile",
"description": "développement d'une application mobile avec Spring
boot et React Native",
"dateDebut": "01/10/2021",
"dateFin": "01/10/2022",
"chefProjet": {
"matricule": "matricule456",
"nom": "Karim",
"prenom": "Ben Mohamed",
"email": "Karimbenmohamed@gmail.com",
"numtel": "87654321"
}
}
]

● Modification d’un projet ayant un identifiant spécifique

Requête PUT /projet/2

Header Content-Type: application/json

Body {
"id": "2",
"nom": "Application Cross Plateforme",
"description": "développement d'une application mobile avec Spring
boot et React Native",
"dateDebut": "01/10/2021",
"dateFin": "01/10/2022",
}

Réponse Status 200 OK

Page 4 sur 8
Body true / false

Travail demandé :

1) Développez le service web RESTful décrit ci-dessus en complétant les parties


manquantes des pseudos codes suivants :
a) La classe RestActivator :
import javax.ws.rs.core.Application;
@ApplicationPath("/") [1]
public class RestActivator extends Application {
}

b) Quel est le rôle de la classe ci-dessus (RestActivator) ?


Afin d’activer les ressources REST définies dans notre application.

c) La classe ProjetRessource où nous allons implémenter les sous-ressources de la


gestion des projets :

@Path("/projets") [2]
public class ProjetRessource {
public static List<Projet> projets=new ArrayList<Projet>();

@POST [3]
@Consumes(MediaType.APPLICATION_JSON) [4]
@Produces(MediaType.TEXT_PLAIN) [5]
public Response [6] ajouterProjet(Projet p) {
if(projets.add(p)) {
return Response.status(Status.CREATED).entity("Projet a été
ajouté avec succès").build(); [7]
}
return Response.status(Status.NOT_FOUND).build(); [8]
}

@PUT [9]
@Path("{id}") [10]
@Consumes(MediaType.APPLICATION_JSON) [11]
public boolean [12] modifierProjet(Projet p [13], @PathParam(value="id") int
id [14] ) {
int index= this.getIndexById(id);
if (index!=-1) {
projets.set(index, p);

Page 5 sur 8
return true [15];
}
return false [16];
}

public int getIndexById(int id) {


for(Projet p: projets) {
if (p.getId()==id)
return projets.indexOf(p);
}
return -1;
}
}

Exercice2 GraphQL
Etude de cas: Gestion des animaux d’un ZOO
On vise à mettre en place une application Java pour la gestion des animaux d’un Zoo
prend en charge deux entités Zoo et Animal comme illustré dans la figure ci-dessous.
Cette application serait exposée en tant qu’un API GraphQL afin de faciliter la
communication avec d’autres applications hétérogènes.
NB : Les attributs code et nom représentent respectivement les clés primaires des
entités Animal et Zoo. "h_ouvert" et "h_ferm" indiquent les horaires d’ouverture et de
fermeture du zoo.

Zoo Animal

- nom : string - code : string


- adresse : string 1 * - nom : string
- h_ouvert: string - age : int
- h_ferm: string - poids: float
- prix: float

Figure1 : Diagramme de Classes

1. GraphQL est l’acronyme de: … Graph Query Language


2. Le GraphQL est une solution permettant de palier à plusieurs problèmes qu’on peut
rencontrer avec REST parmi lesquels on citera la sur-extraction et la sous-extraction.
Donnez brièvement la définition de chacune :

Sous-extraction : … l’envoi de plusieurs requêtes


Sur-extraction : …… téléchargement de données inutiles
Page 6 sur 8
3. Complétez le tableau suivant en ajoutant les critères du GraphQL :

GraphQL
Structure de réponse Fixé par [1] le Client

Format de données [2] JSON

Protocol de Transport [3] HTTP

Protocol de Communication [4] HTTP

Méthode(s) HTTP [5] POST

4. En vous référant à la définition des classes données dans la Figure1 et aux signatures
des méthodes suivantes :

public boolean deleteAnimal(String code) ;


public Animal ajouterAnimal(String code, String nom, int age,
float poids );
public List<Zoo> ListeZoo();
public List<Animal> ListeAnimauxParZoo (String nom) ;

Veuillez compléter le fichier schema.graphqls ci-dessous sachant que le champ code


est obligatoire:

type Zoo {
nom: String
adresse: String
h_ouvert: String
h_ferm: String
prix: Float
}

type Animal {
code: String [1] !
nom: String
age: Int
poids: Int
}

[2] type QueryZoo {


[3] ListeZoo() : [Zoo]
[4] ListeAnimauxParZoo (nom : String) : [Animal]
}

Page 7 sur 8
[5] type MutationZoo {
[6] deleteAnimal (code : String) : Boolean
[7] ajouterAnimal(code : String, nom : String, age :Int, poids :Float) : Animal
}

schema {
query: [8] QueryZoo
mutation: [9] MutationZoo
}

Page 8 sur 8

Vous aimerez peut-être aussi