Fiche d'exercices : Web et HTTP
Partie 1 : Protocole HTTP et URLs
Exercice 1 - Anatomie d'une URL
Analysez cette URL et identifiez ses composants :
https://www.example.com:8080/path/to/page?param1=value1¶m2=value2#section
Identifiez :
- Le protocole
- Le nom de domaine
- Le port
- Le chemin
- Les paramètres de requête
- L'ancre (fragment)
??? tip "Correction" Composants de l'URL :
- Protocole :
https - Nom de domaine :
www.example.com - Port :
8080 - Chemin :
/path/to/page - Paramètres :
param1=value1¶m2=value2 - Ancre :
section
Exercice 2 - Méthodes HTTP
Associez chaque méthode HTTP à son usage :
Méthodes : GET, POST, PUT, DELETE, HEAD, PATCH
Usages :
- Récupérer des données sans les modifier
- Envoyer des données pour créer une ressource
- Remplacer complètement une ressource
- Supprimer une ressource
- Récupérer seulement les en-têtes
- Modifier partiellement une ressource
??? tip "Correction" Associations :
- GET → 1. Récupérer des données sans les modifier
- POST → 2. Envoyer des données pour créer une ressource
- PUT → 3. Remplacer complètement une ressource
- DELETE → 4. Supprimer une ressource
- HEAD → 5. Récupérer seulement les en-têtes
- PATCH → 6. Modifier partiellement une ressource
Exercice 3 - Codes de statut HTTP
Expliquez la signification de ces codes de statut :
- 200
- 301
- 404
- 401
- 500
- 403
- 302
- 418
??? tip "Correction" Significations :
- 200 OK : Requête réussie
- 301 Moved Permanently : Redirection permanente
- 404 Not Found : Ressource non trouvée
- 401 Unauthorized : Authentification requise
- 500 Internal Server Error : Erreur serveur
- 403 Forbidden : Accès interdit
- 302 Found : Redirection temporaire
- 418 I'm a teapot : Code humoristique (RFC 2324)
Exercice 4 - En-têtes HTTP
Analysez cette requête HTTP et répondez aux questions :
GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer abc123
Content-Type: application/json
- Quelle est la méthode utilisée ?
- Quel type de contenu est accepté ?
- Comment l'utilisateur s'authentifie-t-il ?
- Y a-t-il une erreur dans cette requête ?
??? tip "Correction" Analyse :
- Méthode : GET
- Type accepté : application/json
- Authentification : Bearer token (abc123)
- Erreur :
Content-Typene devrait pas être présent dans une requête GET (pas de corps)
Exercice 5 - Session et cookies
Analysez cet échange HTTP et expliquez le mécanisme :
Requête 1 :
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=alice&password=secret
Réponse 1 :
HTTP/1.1 200 OK
Set-Cookie: sessionid=xyz789; HttpOnly; Secure
Location: /dashboard
Requête 2 :
GET /dashboard HTTP/1.1
Cookie: sessionid=xyz789
- Que se passe-t-il dans la première requête ?
- Que fait le serveur avec Set-Cookie ?
- Pourquoi HttpOnly et Secure sont-ils importants ?
- Comment le client prouve-t-il son identité dans la requête 2 ?
??? tip "Correction" Analyse du mécanisme :
- Requête 1 : L'utilisateur envoie ses identifiants de connexion.
- Set-Cookie : Le serveur crée une session et envoie un identifiant de session.
- Sécurité :
HttpOnly: empêche l'accès JavaScript (protection XSS).Secure: transmission uniquement en HTTPS.
- Requête 2 : Le client renvoie automatiquement le cookie pour prouver son identité.
Partie 2 : HTML et CSS
Exercice 6 - Structure HTML
Corrigez ce code HTML qui contient des erreurs :
<html>
<head>
<title>Ma page
</head>
<body>
<h1>Titre principal</h1>
<p>Un paragraphe avec <b>du texte en gras</p>
<img src="image.jpg">
<ul>
<li>Item 1
<li>Item 2</li>
</ul>
</body>
??? tip "Correction" Code corrigé :
<!DOCTYPE html>
<html>
<head>
<title>Ma page</title>
</head>
<body>
<h1>Titre principal</h1>
<p>Un paragraphe avec <b>du texte en gras</b></p>
<img src="image.jpg" alt="Description">
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</body>
</html>
Erreurs corrigées :
- Ajout du DOCTYPE.
- Fermeture de la balise title.
- Fermeture de la balise b.
- Fermeture de la balise p.
- Ajout de l'attribut alt à img.
- Fermeture de la première balise li.
- Fermeture de la balise html.
Exercice 7 - Sélecteurs CSS
Écrivez les sélecteurs CSS pour :
- Tous les paragraphes
- L'élément avec l'id "header"
- Tous les éléments avec la classe "highlight"
- Les liens dans les listes
- Le premier paragraphe de chaque article
- Les éléments survolés par la souris
??? tip "Correction" Sélecteurs CSS :
p#header.highlightli aouul aarticle p:first-child:hover
Exercice 8 - Responsive Design
Créez un CSS responsive pour cette structure :
<div class="container">
<div class="sidebar">Menu</div>
<div class="content">Contenu principal</div>
</div>
Contraintes :
- Desktop : sidebar 25%, content 75%
- Tablet : sidebar 30%, content 70%
- Mobile : sidebar au-dessus, pleine largeur
??? tip "Correction" CSS Responsive :
.container {
display: flex;
}
.sidebar {
width: 25%;
background: #f0f0f0;
}
.content {
width: 75%;
padding: 1rem;
}
/* Tablet */
@media (max-width: 768px) {
.sidebar {
width: 30%;
}
.content {
width: 70%;
}
}
/* Mobile */
@media (max-width: 480px) {
.container {
flex-direction: column;
}
.sidebar, .content {
width: 100%;
}
}
Partie 3 : JavaScript et interactivité
Exercice 9 - Manipulation du DOM
Écrivez le JavaScript pour :
- Changer le texte d'un élément avec l'id "title"
- Ajouter la classe "active" à tous les boutons
- Créer un nouvel élément
<p>et l'ajouter au body - Supprimer tous les éléments avec la classe "temp"
??? tip "Correction" Code JavaScript :
// 1. Changer le texte
document.getElementById('title').textContent = 'Nouveau titre';
// 2. Ajouter une classe à tous les boutons
document.querySelectorAll('button').forEach(btn => {
btn.classList.add('active');
});
// 3. Créer et ajouter un paragraphe
const p = document.createElement('p');
p.textContent = 'Nouveau paragraphe';
document.body.appendChild(p);
// 4. Supprimer les éléments temporaires
document.querySelectorAll('.temp').forEach(el => {
el.remove();
});
Exercice 10 - Requêtes AJAX
Créez une fonction qui :
- Fait une requête GET vers "/api/users"
- Affiche les données dans une liste HTML
- Gère les erreurs de réseau
- Affiche un indicateur de chargement
??? tip "Correction" Fonction AJAX complète :
async function loadUsers() {
const loadingEl = document.getElementById('loading');
const usersList = document.getElementById('users-list');
const errorEl = document.getElementById('error');
try {
// Afficher le chargement
loadingEl.style.display = 'block';
errorEl.style.display = 'none';
// Faire la requête
const response = await fetch('/api/users');
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const users = await response.json();
// Afficher les utilisateurs
usersList.innerHTML = '';
users.forEach(user => {
const li = document.createElement('li');
li.textContent = user.name;
usersList.appendChild(li);
});
} catch (error) {
// Gérer les erreurs
errorEl.textContent = 'Erreur: ' + error.message;
errorEl.style.display = 'block';
} finally {
// Cacher le chargement
loadingEl.style.display = 'none';
}
}