Serveur HTTP
Objectif
Développer un serveur HTTP simple en Java capable de servir des fichiers HTML, CSS et JavaScript. Le serveur doit gérer les requêtes GET et retourner les réponses appropriées. Un journal en JSON doit également être produit sur le serveur pour stocker les requêtes.
Spécification de la requête GET
Une requête GET HTTP suit le format suivant :
Éléments importants :
- La première ligne contient la méthode (
GET), le chemin de la ressource et la version HTTP - L'en-tête
Hostest obligatoire pour HTTP/1.1 - Les en-têtes se terminent par une ligne vide
- Le navigateur utilise le chemin pour localiser la ressource sur le serveur
Spécification des réponses
Réponse 200 OK
Éléments importants :
- La ligne de statut indique le succès avec le code 200
- L'en-tête
Content-Typedoit correspondre au type de fichier :text/htmlpour les fichiers.htmltext/csspour les fichiers.cssapplication/javascriptpour les fichiers.js
- L'en-tête
Content-Lengthindique la taille du contenu en octets - Une ligne vide sépare les en-têtes du contenu
- Le navigateur utilise
Content-Typepour interpréter correctement le fichier
Réponse 404 Not Found
HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 45
Connection: close
<html><body>404 - Fichier non trouvé</body></html>
Éléments importants :
- Le code 404 indique que la ressource demandée n'existe pas
- Retourner une page HTML simple pour informer l'utilisateur
- Respecter le même format d'en-têtes que la réponse 200
- Pensez à une façon pour transformer la requête format texte en objets. Par exemple, l'entête pourrait être intégré dans un
HashMap<String, String>afin d'être plus facilement consultable.
Instructions de laboratoire
Étape 1 : Créer la structure du projet
Organisez votre projet avec un dossier public contenant vos ressources web :
Étape 2 : Implémenter le serveur
- Créez une classe
HttpServerqui écoute sur le port 8080 - Utilisez un
ServerSocketpour accepter les connexions entrantes - Parsez la première ligne de la requête pour extraire le chemin demandé
- Recherchez le fichier correspondant dans le dossier
public- La classe
Filesintégrée à Java contient tout le nécessaire pour la gestion des fichiers
- La classe
- Lire les entêtes et les stocker - elles pourraient être utiles plus tard
Étape 3 : Gérer les réponses
- Lisez le fichier demandé et détermine son type MIME (Entête
Content-Type) - Construisez l'en-tête HTTP avec le statut approprié
- Écrivez l'en-tête suivi du contenu du fichier
- Fermez la connexion après l'envoi
Étape 4 : Tester le serveur
- Démarrez le serveur
- Ouvrez un navigateur et accédez à
http://localhost:8080/index.html - Testez l'accès aux fichiers CSS et JavaScript et que leur résultat fonctionne comme prévu
- Testez une URL invalide pour vérifier la réponse 404
Étape 5 : Journaux JSON
Enregistrez toutes les requêtes dans un fichier JSON. Dans ce fichier, vous devriez avoir :
- La date et l'heure
- L'adresse IP d'où provient la requête
- Le verbe (
GET,POST, etc.) - Le chemin demandé (
/,/index.html, etc.) - La requête URL (queryString, tout ce qui se trouve après le
?dans le chemin) - Le nom de domaine demandé (entête
Host)
Voici un exemple de journal :
[
{
"Date": "2026-03-18 13:02:00",
"IP": "127.0.0.1",
"Verbe": "GET",
"Chemin": "/index.html",
"QueryString": "?recherche=salut",
"Domaine": "localhost"
},
{
"Date": "2026-03-18 13:02:05",
"IP": "127.0.0.1",
"Verbe": "GET",
"Chemin": "/script.js",
"QueryString": "",
"Domaine": "localhost"
}
]
Améliorations
Lorsque tout est fonctionnel pour les requêtes de base, voici les améliorations supplémentaires que vous pouvez apporter :
- Créer une classe
RequeteHTTPet lui envoyer la requête texte dans son constructeur. Cette classe transforme le contenu texte en objet facile d'accès. Par exemple,requeteHttp.getFichier()retournerait/index.html, tandis querequeteHttp.getEntete("Host")retourneraitlocalhost:8000, et ainsi de suite. - Envoyer le fichier
index.htmlpar défaut lorsque le chemin est/ - Permettre d'offrir des images en plus du texte
- Au lieu d'un
PrintWriter, il vous faudra utiliser unBufferedOutputStream
- Au lieu d'un
- Permettre d'écrire un fichier lorsqu'une requête
POSTest faite vers un chemin- Par exemple, une requête
POSTvers/page.htmlécrira le contenu spécifié dans le fichier/page.html
- Par exemple, une requête
- Implanter de l'authentification de base pour les chemins
/adminqui demandera un nom d'utilisateur et un mot de passe au navigateur. Regardez pour l'entêteAuthorization: Basic ..., l'encodageBase64et son implémentation côté serveur et côté client.