# Anatomie d'une requête HTTP

HTTP (*HyperText Transfer Protocol*) est le protocole du web. Le principe est simple : un **client** envoie une **requête**, le **serveur** renvoie une **réponse**. Toujours dans ce sens, toujours une réponse par requête.

### Voir HTTP en vrai

L'option `-v` (verbose) de `curl` affiche tout l'échange :

```bash
curl -v https://formation.tfrichet.fr
```

Les lignes qui commencent par `>` sont envoyées par le client, celles qui commencent par `<` sont reçues du serveur.

### La requête

Exemple avec [JSONPlaceholder](https://jsonplaceholder.typicode.com), une fausse API publique faite pour s'entraîner :

```bash
curl -v https://jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -d '{"title": "Hello", "body": "Mon premier article", "userId": 1}'
```

```http
POST /posts HTTP/1.1
Host: jsonplaceholder.typicode.com
User-Agent: curl/8.10.1
Accept: */*
Content-Type: application/json

{"title": "Hello", "body": "Mon premier article", "userId": 1}
```

- **Ligne de requête** : la méthode (`POST`), le chemin (`/posts`) et la version de HTTP.
- **Headers** : des paires `Nom: valeur` qui donnent des informations sur la requête.
- **Ligne vide**, puis le **body** (facultatif) : les données envoyées.

### La réponse

```http
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: https://jsonplaceholder.typicode.com/posts/101

{"title": "Hello", "body": "Mon premier article", "userId": 1, "id": 101}
```

- **Ligne de statut** : la version, le **code de statut** et sa description.
- **Headers**, ligne vide, puis le **body**.

### Les headers à connaître

<table id="bkmrk-headersensr%C3%B4le-hostr"><thead><tr><th>Header</th><th>Sens</th><th>Rôle</th></tr></thead><tbody><tr><td>`Host`</td><td>Requête</td><td>Le nom de domaine visé (plusieurs sites peuvent partager un serveur)</td></tr><tr><td>`Content-Type`</td><td>Les deux</td><td>Le format du body envoyé : `application/json`, `text/html`…</td></tr><tr><td>`Accept`</td><td>Requête</td><td>Le format que le client souhaite recevoir</td></tr><tr><td>`Authorization`</td><td>Requête</td><td>Les informations d'authentification</td></tr><tr><td>`User-Agent`</td><td>Requête</td><td>Le logiciel client</td></tr><tr><td>`Set-Cookie` / `Cookie`</td><td>Réponse / Requête</td><td>Le serveur dépose un cookie, le client le renvoie ensuite</td></tr><tr><td>`Location`</td><td>Réponse</td><td>L'adresse d'une ressource créée ou d'une redirection</td></tr></tbody></table>

<p class="callout warning">Oublier `Content-Type: application/json` en envoyant du JSON est l'erreur numéro 1. Le serveur ne sait pas comment lire le body et répond souvent par une erreur peu claire.</p>

### Un protocole sans état

HTTP est **sans état** (*stateless*) : le serveur ne se souvient de rien entre deux requêtes. Chaque requête doit contenir tout ce qu'il faut pour être comprise.

Alors comment un site sait-il que vous êtes connecté ? Le client renvoie à chaque requête une preuve d'identité : un **cookie** pour un site web, un **token** ou une **clé d'API** pour une API.

<p class="callout info">HTTP n'a pas de mémoire persistante. Ce n'est pas un défaut : c'est ce qui permet de répartir les requêtes sur plusieurs serveurs.</p>

### Les familles de codes de statut

<table id="bkmrk-famillesignification"><thead><tr><th>Famille</th><th>Signification</th><th>Exemples</th></tr></thead><tbody><tr><td>**1xx**</td><td>Information, patientez</td><td>`101 Switching Protocols`</td></tr><tr><td>**2xx**</td><td>Succès</td><td>`200 OK`, `201 Created`, `204 No Content`</td></tr><tr><td>**3xx**</td><td>Redirection, c'est ailleurs</td><td>`301 Moved Permanently`, `304 Not Modified`</td></tr><tr><td>**4xx**</td><td>Erreur du client : c'est ta faute</td><td>`400 Bad Request`, `401`, `404 Not Found`</td></tr><tr><td>**5xx**</td><td>Erreur du serveur : c'est la mienne</td><td>`500 Internal Server Error`, `503 Service Unavailable`</td></tr></tbody></table>

Le détail des codes est vu au chapitre 2.

### Et HTTPS, HTTP/2, HTTP/3 ?

- **HTTPS** : le même HTTP, mais chiffré par TLS.
- **HTTP/2** et **HTTP/3** : le transport est plus rapide (multiplexage, QUIC), mais les méthodes, headers et codes restent les mêmes. Tout ce cours s'applique.