Aller au contenu

Partie 3 : Formulaires et requêtes HTTP


Un formulaire est un ensemble de composants graphiques (champs de saisie, boutons, listes déroulantes...) qui permet à l'utilisateur d'envoyer des données au serveur. C'est le mécanisme fondamental de l'interaction homme-machine sur le Web.

Exemples de formulaires courants : connexion à un site, inscription, barre de recherche, commentaires, commandes en ligne.

<form action="/traitement" method="post">
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom">
<label for="email">Email :</label>
<input type="email" id="email" name="email">
<button type="submit">Envoyer</button>
</form>
Attribut de <form>Rôle
actionURL du programme serveur qui traitera les données
methodMéthode HTTP utilisée (get ou post)
<input type="text" name="prenom" placeholder="Votre prénom">
<input type="email" name="email" placeholder="[email protected]">
<input type="password" name="mdp" placeholder="Mot de passe">
<input type="number" name="age" min="0" max="120">
<input type="date" name="naissance">
<input type="url" name="site">
<textarea name="commentaire" rows="4" cols="50"></textarea>
TypeAffichageValidation
textChamp texte libreAucune
emailChamp texteVérifie le format email
passwordCaractères masquésAucune
numberChamp numérique avec flèchesVérifie que c'est un nombre
dateSélecteur de dateFormat de date
urlChamp texteVérifie le format URL
<!-- Case à cocher (choix multiples) -->
<input type="checkbox" name="option1" value="a"> Option A
<input type="checkbox" name="option2" value="b"> Option B
<!-- Bouton radio (choix unique) -->
<input type="radio" name="niveau" value="seconde"> Seconde
<input type="radio" name="niveau" value="premiere"> Première
<input type="radio" name="niveau" value="terminale"> Terminale
<!-- Liste déroulante -->
<select name="matiere">
<option value="nsi">NSI</option>
<option value="maths">Mathématiques</option>
<option value="physique">Physique</option>
</select>
<button type="submit">Envoyer</button>
<button type="reset">Réinitialiser</button>
<button type="button">Action JavaScript</button>
TypeComportement
submitSoumet le formulaire (envoie les données)
resetRemet tous les champs à leur valeur initiale
buttonAucun comportement par défaut (utilisé avec JavaScript)
<input type="text" name="nom"
required <!-- champ obligatoire -->
placeholder="Entrez votre nom" <!-- texte indicatif -->
maxlength="50" <!-- longueur maximale -->
value="Alice" <!-- valeur par défaut -->
>

Avant d'envoyer les données au serveur, on peut vérifier leur validité en JavaScript :

<form id="inscription">
<label for="pseudo">Pseudo (3 à 20 caractères) :</label>
<input type="text" id="pseudo" name="pseudo">
<span id="erreur" style="color: red;"></span>
<br>
<button type="submit">S'inscrire</button>
</form>
let formulaire = document.getElementById("inscription");
let champPseudo = document.getElementById("pseudo");
let messageErreur = document.getElementById("erreur");
formulaire.addEventListener("submit", function(e) {
let pseudo = champPseudo.value;
if (pseudo.length < 3 || pseudo.length > 20) {
e.preventDefault(); // empêche l'envoi du formulaire
messageErreur.textContent = "Le pseudo doit contenir entre 3 et 20 caractères.";
} else {
messageErreur.textContent = "";
}
});

e.preventDefault() empêche le comportement par défaut du formulaire (l'envoi des données) pour permettre d'afficher un message d'erreur à l'utilisateur.


HTTP (HyperText Transfer Protocol) est le protocole de communication entre le client (navigateur) et le serveur Web. Chaque interaction suit le schéma requête → réponse.

Client Serveur
│ │
│──── Requête HTTP ──────────────────►│
│ (méthode, URL, en-têtes, corps) │
│ │
│◄─── Réponse HTTP ─────────────────│
│ (code, en-têtes, corps) │

Une requête HTTP se compose de :

  1. La ligne de requête : méthode + URL + version HTTP
  2. Les en-têtes (headers) : informations complémentaires
  3. Le corps (body) : les données envoyées (pour POST)

Exemple de requête GET :

GET /page.html HTTP/1.1
Host: www.exemple.fr
Accept: text/html
Accept-Language: fr

Exemple de requête POST :

POST /connexion HTTP/1.1
Host: www.exemple.fr
Content-Type: application/x-www-form-urlencoded
identifiant=alice&motdepasse=secret
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
<!DOCTYPE html>
<html>...

La première ligne contient le code de statut :

CodeSignification
200OK - la requête a réussi
301Redirection permanente
403Accès interdit (Forbidden)
404Page non trouvée (Not Found)
500Erreur interne du serveur

La méthode GET transmet les paramètres dans l'URL, après le caractère ? :

https://www.exemple.fr/recherche?q=NSI&page=1

Les paramètres sont des paires nom=valeur séparées par &.

<form action="/recherche" method="get">
<input type="text" name="q" placeholder="Rechercher...">
<button type="submit">Chercher</button>
</form>

Si l'utilisateur tape « Python » et valide, le navigateur envoie :

GET /recherche?q=Python HTTP/1.1

Caractéristiques de GET :

  • Les paramètres sont visibles dans l'URL (barre d'adresse)
  • L'URL peut être mise en favori ou partagée
  • La taille des données est limitée (environ 2 000 caractères pour l'URL)
  • Utilisé pour les lectures (recherche, consultation)

La méthode POST transmet les paramètres dans le corps de la requête, invisibles dans l'URL :

<form action="/connexion" method="post">
<input type="text" name="identifiant">
<input type="password" name="motdepasse">
<button type="submit">Se connecter</button>
</form>

La requête envoyée :

POST /connexion HTTP/1.1
Host: www.exemple.fr
Content-Type: application/x-www-form-urlencoded
identifiant=alice&motdepasse=secret

Caractéristiques de POST :

  • Les paramètres sont invisibles dans l'URL
  • L'URL ne peut pas être mise en favori avec les données
  • Pas de limite pratique de taille pour les données
  • Utilisé pour les modifications (connexion, inscription, envoi de fichier)
CritèreGETPOST
Paramètres dans...L'URLLe corps de la requête
VisibilitéVisibles dans la barre d'adresseNon visibles dans l'URL
Mise en favoriOui (URL complète)Non
Taille des donnéesLimitée (~2 000 car.)Pas de limite pratique
Usage typiqueRecherche, consultationConnexion, inscription, envoi de données
SécuritéDonnées exposées dans l'URLDonnées dans le corps (pas dans l'historique)

Quand le formulaire est soumis, le serveur reçoit les données et les traite avec un programme côté serveur (en Python, PHP, JavaScript/Node.js...).

Le serveur peut :

  • Stocker les données dans une base de données
  • Vérifier les identifiants de connexion
  • Générer une page HTML de réponse personnalisée
  • Envoyer un email de confirmation

Voici un exemple simplifié de serveur Web en Python utilisant le micro-framework Flask :

from flask import Flask, request
app = Flask(__name__)
@app.route("/inscription", methods=["POST"])
def inscription():
nom = request.form["nom"]
email = request.form["email"]
return f"<h1>Bienvenue {nom} !</h1><p>Email enregistré : {email}</p>"
app.run()

Ce programme :

  1. Reçoit les données du formulaire via request.form
  2. Extrait les champs nom et email
  3. Renvoie une page HTML personnalisée

HTML (contact.html) :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Contact</title>
<style>
body { font-family: Arial, sans-serif; max-width: 500px; margin: 50px auto; }
label { display: block; margin-top: 15px; font-weight: bold; }
input, textarea, select { width: 100%; padding: 8px; margin-top: 5px; }
button { margin-top: 20px; padding: 10px 30px; background: #3498db; color: white; border: none; cursor: pointer; }
button:hover { background: #2980b9; }
.erreur { color: red; font-size: 14px; }
.succes { color: green; font-weight: bold; }
</style>
</head>
<body>
<h1>Formulaire de contact</h1>
<form id="formContact" action="/contact" method="post">
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom" required>
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
<label for="sujet">Sujet :</label>
<select id="sujet" name="sujet">
<option value="question">Question</option>
<option value="bug">Signaler un problème</option>
<option value="suggestion">Suggestion</option>
</select>
<label for="message">Message :</label>
<textarea id="message" name="message" rows="5" required></textarea>
<p id="feedback" class="erreur"></p>
<button type="submit">Envoyer</button>
</form>
<script src="contact.js"></script>
</body>
</html>

JavaScript (contact.js) :

let formulaire = document.getElementById("formContact");
let feedback = document.getElementById("feedback");
formulaire.addEventListener("submit", function(e) {
let nom = document.getElementById("nom").value.trim();
let email = document.getElementById("email").value.trim();
let message = document.getElementById("message").value.trim();
// Validation
if (nom.length < 2) {
e.preventDefault();
feedback.textContent = "Le nom doit contenir au moins 2 caractères.";
feedback.className = "erreur";
return;
}
if (message.length < 10) {
e.preventDefault();
feedback.textContent = "Le message doit contenir au moins 10 caractères.";
feedback.className = "erreur";
return;
}
feedback.textContent = "Formulaire valide, envoi en cours...";
feedback.className = "succes";
});

  • Un formulaire HTML (<form>) permet à l'utilisateur d'envoyer des données au serveur.
  • Chaque champ doit avoir un attribut name pour que sa valeur soit transmise.
  • Les types de champs principaux : text, email, password, number, checkbox, radio, select.
  • La méthode GET transmet les paramètres dans l'URL (visible, limité, pour les lectures).
  • La méthode POST transmet les paramètres dans le corps de la requête (invisible dans l'URL, pour les modifications).
  • Une requête HTTP = ligne de requête + en-têtes + corps. Une réponse = code de statut + en-têtes + corps.
  • Les codes de statut courants : 200 (OK), 404 (non trouvé), 500 (erreur serveur).
  • La validation côté client (JavaScript) améliore l'ergonomie mais le serveur doit toujours re-valider.
  • e.preventDefault() empêche le comportement par défaut d'un événement (envoi de formulaire, suivi de lien...).