Travail noté #
Question 1 : Service web REST avec JSON #
Dans cette première question, vous créerez un service web REST simple en Java qui fournit des données JSON. Vous développerez un serveur qui expose plusieurs endpoints REST pour gérer des ressources.
Voici la structure Java de base que vous devez utiliser :
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.*;
public class ServeurREST {
private static List<Map<String, Object>> ressources = new ArrayList<>();
private static int nextId = 2; // Prochain ID disponible
static {
// Initialiser avec quelques données de test
Map<String, Object> item1 = new HashMap<>();
item1.put("id", 1);
item1.put("nom", "Exemple 1");
item1.put("valeur", 42);
ressources.add(item1);
}
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
// Endpoint GET /api/ressources - Liste toutes les ressources
server.createContext("/api/ressources", exchange -> {
if ("GET".equals(exchange.getRequestMethod())) {
try {
// C'est à vous d'implémenter la logique pour retourner la liste en JSON
String jsonResponse = "[]"; // Placeholder
byte[] response = jsonResponse.getBytes("UTF-8");
exchange.getResponseHeaders().set("Content-Type", "application/json; charset=UTF-8");
exchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*");
exchange.sendResponseHeaders(200, response.length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(response);
}
} catch (Exception e) {
exchange.sendResponseHeaders(500, -1);
}
} else if ("POST".equals(exchange.getRequestMethod())) {
// C'est à vous d'implémenter la logique pour ajouter une ressource
exchange.sendResponseHeaders(201, -1);
} else {
exchange.sendResponseHeaders(405, -1);
}
});
// Endpoint GET /api/ressources/{id} - Ressource spécifique
server.createContext("/api/ressources/", exchange -> {
String path = exchange.getRequestURI().getPath();
String idStr = path.substring(path.lastIndexOf('/') + 1);
if ("GET".equals(exchange.getRequestMethod())) {
try {
// C'est à vous d'implémenter la logique pour retourner une ressource spécifique
exchange.sendResponseHeaders(404, -1); // Placeholder
} catch (Exception e) {
exchange.sendResponseHeaders(500, -1);
}
} else if ("PUT".equals(exchange.getRequestMethod())) {
try {
// C'est à vous d'implémenter la logique pour modifier une ressource
exchange.sendResponseHeaders(200, -1); // Placeholder
} catch (Exception e) {
exchange.sendResponseHeaders(500, -1);
}
} else if ("DELETE".equals(exchange.getRequestMethod())) {
try {
// C'est à vous d'implémenter la logique pour supprimer une ressource
exchange.sendResponseHeaders(204, -1); // Placeholder
} catch (Exception e) {
exchange.sendResponseHeaders(500, -1);
}
} else {
exchange.sendResponseHeaders(405, -1);
}
});
server.setExecutor(null);
server.start();
System.out.println("Serveur REST démarré sur http://localhost:8080/");
}
}
Vous devez compléter la logique métier dans chaque endpoint en utilisant Gson pour la manipulation JSON :
- GET /api/ressources : Retourner la liste complète des ressources en JSON
- GET /api/ressources/{id} : Retourner une ressource spécifique (404 si inexistante)
- POST /api/ressources : Ajouter une nouvelle ressource avec validation des données
- PUT /api/ressources/{id} : Modifier une ressource existante (404 si inexistante)
- DELETE /api/ressources/{id} : Supprimer une ressource (404 si inexistante)
Vous devez utiliser la bibliothèque Gson pour la manipulation JSON.
Ressources :
- Guide REST API : https://restfulapi.net/
- Java HttpServer : https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html
Livrables : Code Java complet du serveur REST, et documentation des endpoints.
Question 2 : Correction d’un fichier YAML #
Voici un fichier YAML défaillant que vous devez corriger :
invalid_yaml: true
person:
name: Alice
age: 30
jobs:
- developer
- manager
color: red
color: blue
bad_mapping: {key: value, another: value
description: Ceci est une description: avec des deux-points non protégés
numbers:
- 1
- 2
- 3
Pour chaque problème, expliquez l’erreur et fournissez la version corrigée du fichier YAML (un fichier valide).
Ressources :
- Spécification YAML : https://yaml.org/spec/1.2.2/
- Validateur en ligne : https://www.yamllint.com/
Livrables : Le fichier YAML corrigé et un document expliquant chacune des erreurs identifiées.
Rapport vidéo #
Vous pouvez remettre votre rapport sous forme de vidéo plutôt qu’en format écrit : une démonstration commentée à l’écran dans laquelle vous présentez votre code, son exécution et vos résultats. Le code source et les fichiers demandés doivent tout de même être remis. Les critères du barème s’appliquent de la même façon, que le rapport soit écrit ou filmé.
Barème de correction #
Ce travail est noté sur 10 points, soit les 10 % qu’il vaut dans la note finale.
| Critère | Points |
|---|---|
| Question 1 — service web REST avec Gson (les cinq endpoints) | 7 |
| Question 2 — correction et explication du fichier YAML | 2 |
| Documentation des endpoints et qualité du code | 1 |
Les points de chaque critère sont accordés au prorata de ce qui fonctionne et de ce qui est démontré dans la remise. Un travail qui ne compile pas ou ne s’exécute pas ne peut obtenir plus de la moitié des points.