Comprendre HTTP
HTTP (Hypertext Transfer Protocol) est un protocole textuel, sans état, à requête-réponse destiné à servir des documents web.
Requête : Le client (browser) demande à lire ou modifier un document (hypertexte, image, …)
Réponse : Le server envoie une réponse (pas nécessairement le document).
Textuel : Toutes les communications sont codées en ASCII.
Sans état : Le server ne se souvient pas du client entre deux requêtes.
Le protocole HTTP
Servi habituellement sur le port 80. Exemple de dialogue HTTP.
REQUÊTE
GET / HTTP/1.1
Host: www.google.fr
RÉPONSE
HTTP/1.1 200 OK
Date: Tue, 24 Jan 2012 17:09:10 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=4479751101deda66:FF=0:TM=1327424950:LM=1327424950:S=CDCjreHNXoofkoQk; expires=Thu, 23-Jan-2014 17:09:10 GMT; path=/; domain=.google.fr
Set-Cookie: NID=56=jkWXBR2FaxtIwRcpdJ-3nAJqgoJ2hDIqdo0Q7-ttgoCSX_5go3FrbRWBWg0em3oKnE88UcPz-4sjCwQNxb7iPcs7vu-kXQ3zKnSlXH97v-TAQgOQfNx2QqCM2XNPCUUl; expires=Wed, 25-Jul-2012 17:09:10 GMT; path=/; domain=.google.fr; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
1000
<!doctype html>...
La requête HTTP
POST /document.html HTTP/1.1
Host: www.example.com
User-Agent: Mosaic/2.1
Cookie: sessionid=aa03x;
Content-Length: 10
1234567890
- Action,
- Entêtes (seulement
Host
est obligatoire), - Une ligne vide (attention:
<CR><LF>
), - Corps du message (Optionnel).
La ligne d’action
POST /document.html HTTP/1.1
Méthode
- HEAD Demande seulement les entêtes.
- GET Demande une page. Ne modifie pas l’état du server.
- POST Envoie des données. Peut entraîner une modification de l’état du server.
D’autres méthodes occasionnellement utilisées: PUT
, DELETE
,
TRACE
, OPTIONS
, CONNECT
, PATCH
.
Ressource
Adresse du document web.
Protocole
Deux possibilités: HTTP/1.0
ou HTTP/1.1
. (HTTP/2.0
en cours?)
Entêtes des requêtes
Host: www.example.com
User-Agent: Mosaic/2.1
Cookie: sessionid=aa03x;
Content-Length: 10
Servent à envoyer des meta-données au server.
Obligatoires
- Host Le nom de domaine du server à qui on envoie la requête.
- Content-Length Obligatoire seulement pour POST et PUT. Donne la longueur en octets du contenu.
Fréquentes
- Accept-* Type de contenu que le client accepte (type, encodage, langue)
- Cookie Utilisé pour la persistance côté client.
- Referer Adresse qui a donné origine à la requête.
- User-Agent Nom du browser du client.
- Content-Type MIME type du contenu (texte, HTML, etc.).
Les applications peuvent définir leur propres entêtes (en général avec un prefixe X-).
Réponse HTTP
HTTP/1.1 200 OK
Date: Tue, 24 Jan 2012 18:34:40 GMT
Server: Apache/2.2.21 (Debian)
Last-Modified: Fri, 10 Dec 2010 14:10:25 GMT
Content-Length: 53
Content-Type: text/html
Set-Cookie: sessionid=jkWXBR; expires=Wed, 25-Jul-2012 17:09:10 GMT; path=/; domain=.google.fr; HttpOnly
<html><head></head><body><h1>Hello world!</h1></html>
- Status line,
- Entêtes,
- Une ligne vide (attention:
<CR><LF>
), - Contenu (Optionnel).
La status line
HTTP/1.1 200 OK
Protocole + code d’état + message
Les codes d’état décrivent le résultat de la requête. Les plus fréquents :
- 200 OK Le document a été trouvé et envoyé au client.
- 301 MOVED PERMANENTLY Rédirection permanente (nécessite
Location
). - 302 FOUND
- 303 SEE OTHER
- 307 TEMPORARY REDIRECT Différents types de redirection (nécessitent
Location
). - 400 BAD REQUEST Le client a envoyé une requête mal formatée.
- 403 FORBIDDEN Le document n’est pas accessible.
- 404 NOT FOUND Le document est inconnu au server.
- 410 GONE Le document n’existe plus.
- 418 I’M A TEAPOT Poison d’avril IETF 1998.
- 500 INTERNAL SERVER ERROR Erreur sur le server.
- 503 SERVICE UNAVAILABLE Le server est momentanément indisponible.
Entêtes de la réponse
Date: Tue, 24 Jan 2012 18:34:40 GMT
Server: Apache/2.2.21 (Debian)
Last-Modified: Fri, 10 Dec 2010 14:10:25 GMT
Content-Length: 53
Content-Type: text/html
Set-Cookie: sessionid=jkWXBR; expires=Wed, 25-Jul-2012 17:09:10 GMT; path=/; domain=.google.fr; HttpOnly
Plus fréquentes :
- Date, Expires, Last-Modified Gestion des caches.
- Content-Type MIME type du contenu de la réponse.
- Content-Length Longueur en octets du contenu. Non obligatoire (peut être spécifié autrement).
- Location Utilisé par les redirections.
- Sever Nom du logiciel du server.
- Set-Cookie Utilisé pour la persistance côté client.
Références
- La page Wikipedia.
- Le guide HTTP de MDN. Très complet, mais en anglais.