Aller au contenu principal

Le protocole HTTP

Notions théoriques

Le protocole HTTP (HyperText Transfer Protocol) est le fondement de toute communication de données sur le Web.

Les requêtes HTTP

Lorsqu'un client (généralement un navigateur Web) envoie une requête HTTP à un serveur, le serveur envoie une réponse HTTP en retour.

Les requêtes HTTP sont composées de 4 parties :

  • Méthode : Le type d'action que le client souhaite effectuer. Les plus courantes sont GET (récupérer des données) et POST (envoyer des données).
  • URL : L'adresse où la requête est envoyée.
  • En-têtes : Informations supplémentaires sur la requête ou la réponse.
  • Corps : Les données réelles envoyées ou reçues.

Les méthodes HTTP définissent le type d'action que le client souhaite effectuer.

Les 2 méthodes les plus couramment utilisées sont GET et POST.

  • GET : Cette méthode est utilisée pour récupérer des informations du serveur en utilisant une URL spécifique.

    Par exemple, lorsque vous tapez une adresse de site Web dans votre navigateur, vous effectuez une requête GET. Les requêtes GET sont sans effet sur les ressources du serveur, elles ne modifient pas l'état du serveur. Elles sont idéales pour les actions de lecture seule où aucune donnée n'est modifiée sur le serveur.

  • POST : Cette méthode est utilisée pour envoyer des données au serveur.

    Par exemple, lorsque vous remplissez un formulaire sur un site Web et que vous appuyez sur "envoyer" ou "soumettre", vous effectuez généralement une requête POST. Les requêtes POST peuvent modifier l'état du serveur, par exemple en ajoutant une nouvelle information dans une base de données.

astuce

Une différence importante entre les 2 méthodes est :

  • que les requêtes GET incluent toutes les informations dans l'URL,
  • tandis que les requêtes POST envoient les informations dans le corps de la requête.

Cela signifie que les requêtes POST peuvent envoyer beaucoup plus d'informations que les requêtes GET, et ces informations peuvent être de types variés (pas seulement du texte).

Et comme les informations envoyées avec une requête POST ne sont pas visibles dans l'URL, cette méthode est plus sûre pour envoyer des informations sensibles, comme des mots de passe.

Les réponses HTTP

Les réponses HTTP incluent un code de statut qui indique si la requête a été réussie ou non :

  • Par exemple, "200 OK" signifie que la requête a été traitée avec succès,
  • tandis que "404 Not Found" signifie que la ressource demandée n'a pas été trouvée sur le serveur.

Un protocole sans état

Le protocole HTTP est un protocole sans état (stateless en anglais).

Cela signifie que chaque requête HTTP envoyée par un client HTTP (comme un navigateur Web ou un outil tel que Postman ou Curl) est traitée indépendamment des requêtes précédentes. Le serveur ne conserve aucune information entre les requêtes successives d'un même client.

Des requêtes indépendantes.

  • Sans état signifie que le serveur ne garde aucune mémoire des interactions précédentes avec le client. Par exemple, si un client envoie une requête HTTP pour une page Web, le serveur traite la requête, renvoie la réponse et "oublie" immédiatement la demande. La prochaine requête que le client envoie sera considérée comme entièrement nouvelle, sans lien avec les requêtes précédentes.

  • Indépendance des requêtes : Chaque requête contient toutes les informations nécessaires pour que le serveur puisse la traiter. Cela inclut l'URL demandée, les en-têtes HTTP, les cookies, et d'autres données, comme les paramètres de requête. Il n'y a pas de lien persistant entre les différentes requêtes HTTP dans un contexte sans état.

astuce

Imaginez que vous consultez une boutique en ligne :

  1. Vous envoyez une requête pour voir la page d'accueil.
  2. Ensuite, vous envoyez une requête pour voir un produit spécifique.
  3. Enfin, vous envoyez une requête pour ajouter cet article au panier.

Chaque requête est indépendante et le serveur ne garde aucune mémoire de la précédente. Pour maintenir la continuité de la session utilisateur (comme savoir ce qui est dans votre panier), des mécanismes supplémentaires comme les cookies, sessions, ou tokens (ex : JWT) sont utilisés.

Pourquoi HTTP est sans état ?

La nature sans état de HTTP rend le protocole plus simple et scalable. Cela permet aux serveurs de traiter chaque requête de manière autonome sans avoir à suivre l'historique des interactions de chaque client, ce qui réduit la charge de travail pour le serveur. Cependant, dans des applications complexes (comme les applications Web modernes), cette fonctionnalité sans état est compensée par l'utilisation de mécanismes supplémentaires (les sessions et les cookies).

Comment maintenir une continuité dans les actions des internautes avec un protocole sans état ?

Pour compenser cette nature sans état, divers mécanismes sont utilisés dans les applications Web pour suivre les utilisateurs et maintenir une continuité dans leurs actions :

  • Cookies : Le serveur envoie des cookies au client, qui sont stockés localement dans le navigateur. À chaque nouvelle requête, le client renvoie ces cookies, permettant au serveur de reconnaître l'utilisateur et de suivre son activité.

  • Sessions : Un serveur peut créer une session pour chaque utilisateur qui se connecte, et associer cette session à un identifiant unique stocké dans un cookie. Cela permet au serveur de maintenir des informations sur l'utilisateur tant que la session est active.

  • Tokens (jetons) : Dans certaines applications, des jetons d'authentification (comme JWT, JSON Web Tokens) sont utilisés pour permettre aux serveurs d'identifier les utilisateurs et de conserver un état entre les requêtes, sans réellement stocker de données côté serveur.

Exemple pratique

Prenons un exemple concret. Lorsque vous tapez http://www.example.com dans votre navigateur, une requête HTTP est envoyée au serveur hébergeant www.example.com.

  • La requête pourrait ressembler à ceci :

    GET / HTTP/1.1
    Host: www.example.com
  • Le serveur répondra alors avec quelque chose comme :

    HTTP/1.1 200 OK
    Date: Wed, 24 Aug 2023 12:04:23 GMT
    Content-Type: text/html; charset=UTF-8

    <!DOCTYPE html>
    <html>
    <head>
    <title>Exemple</title>
    </head>
    <body>
    Bienvenue sur www.example.com!
    </body>
    </html>

Test de mémorisation/compréhension


Qu'est-ce qu'une requête HTTP ?


Quel code de statut HTTP indique que la requête a été traitée avec succès ?


Quelle est la principale différence entre les méthodes HTTP GET et POST ?


Pourquoi le protocole HTTP est-il qualifié de sans état ?


Quel code de statut HTTP est renvoyé lorsqu'une ressource demandée n'est pas trouvée sur le serveur ?


Quel est l'avantage principal d'une requête POST par rapport à une requête GET ?


Quel mécanisme permet à un serveur de conserver l'état d'une session utilisateur dans un contexte HTTP sans état ?


Lequel des énoncés suivants est vrai concernant les requêtes HTTP GET ?


Quel en-tête HTTP est utilisé pour indiquer le format du contenu envoyé ou reçu dans une requête HTTP ?


Dans le contexte HTTP, que signifie l'acronyme 'JWT' souvent utilisé pour maintenir l'état d'une session utilisateur ?


Quel est le rôle des cookies dans le protocole HTTP ?


Quel code de statut HTTP indique qu'une requête POST a réussi et qu'une nouvelle ressource a été créée ?


Explications des réponses

TP pour étudier le protocole HTTP

1) Postman installation

Pour ce TP, vous allez utiliser un outil appelé Postman, qui permet d'envoyer des requêtes HTTP et de voir les réponses.

  1. Téléchargez et installez Postman https://www.postman.com/.
  2. Ouvrez Postman et créez une nouvelle requête GET.
  3. Dans la barre d'adresse, tapez http://www.example.com et appuyez sur "Send".
  4. Examinez la réponse du serveur. Pouvez-vous identifier les différentes parties de la réponse HTTP que nous avons discutées plus tôt ?
Résultats du TP
  1. Après avoir installé Postman, vous avez créé une nouvelle requête GET.
  2. Vous avez entré http://www.example.com dans la barre d'adresse et appuyé sur "Send".
  3. Dans la réponse du serveur, vous pouvez voir les différentes parties d'une réponse HTTP :
    • La ligne de statut ("HTTP/1.1 200 OK")
    • Les en-têtes de réponse (par exemple, "Date", "Content-Type")
    • Le corps de la réponse, qui dans ce cas est un document HTML.

2) Requête GET (Postman)

Dans ce TP, vous allez utiliser Postman pour envoyer une requête à une API publique et analyser la réponse.

Objectif

Utiliser Postman pour interroger l'API publique de GitHub et analyser la réponse.

Étapes à suivre

  1. Ouvrir Postman :

    • Lancez l'application Postman sur votre ordinateur.
  2. Créer une nouvelle requête GET :

    • Cliquez sur "New" et sélectionnez "Request".
    • Donnez un nom à votre requête, par exemple "GitHub User API".
  3. Configurer la requête :

    • Dans la barre d'adresse, entrez l'URL de l'API : https://api.github.com/users/octocat.
    • Assurez-vous que le type de requête est bien "GET".
  4. Envoyer la requête :

    • Cliquez sur "Send" pour envoyer la requête à l'API.
  5. Analyser la réponse :

    • Ligne de statut : Vérifiez la ligne de statut pour vous assurer que la requête a été traitée avec succès (par exemple, "HTTP/1.1 200 OK").
    • En-têtes de réponse : Examinez les en-têtes pour obtenir des informations sur le serveur et le type de contenu (par exemple, "Content-Type: application/json").
    • Corps de la réponse : Regardez le corps de la réponse, qui devrait contenir des données au format JSON. Vous verrez des informations sur l'utilisateur "octocat", telles que le nom, le nombre de dépôts publics, etc.

Résultats attendus

  • Ligne de statut : Vous devriez voir "HTTP/1.1 200 OK", indiquant que la requête a réussi.
  • En-têtes de réponse : Ceux-ci incluront des informations comme "Server", "Content-Type", et "Date".
  • Corps de la réponse : Vous verrez un objet JSON contenant des clés et des valeurs telles que "login", "id", "node_id", "avatar_url", "url", "name", etc.

Analyse des résultats

  • Ligne de statut : Confirmez que le statut est 200, ce qui signifie que la requête a été traitée avec succès.
  • En-têtes de réponse : Notez le "Content-Type", qui devrait être "application/json", indiquant que le corps de la réponse est en format JSON.
  • Corps de la réponse : Explorez les données disponibles. Par exemple, "login" montre le nom d'utilisateur, "avatar_url" fournit l'URL de l'image de profil, et "public_repos" indique le nombre de dépôts publics de l'utilisateur.

3) Requête POST (Postman)

Dans ce TP, vous allez utiliser Postman pour envoyer une requête POST à une API publique et analyser la réponse.

Objectif

Apprendre à configurer et envoyer une requête POST avec Postman, et comprendre comment analyser la réponse.

Étapes à suivre

  1. Ouvrir Postman :

    • Lancez l'application Postman sur votre ordinateur.
  2. Créer une nouvelle requête POST :

    • Cliquez sur "New" et sélectionnez "Request".
    • Donnez un nom à votre requête, par exemple "Fake API POST Request".
  3. Configurer la requête :

    • Dans la barre d'adresse, entrez l'URL de l'API.

      Pour cet exercice, nous utiliserons une API de test : https://jsonplaceholder.typicode.com/posts.

    • Changez le type de requête en "POST".
  4. Ajouter le corps de la requête :

    • Cliquez sur l'onglet "Body".
    • Sélectionnez "raw" et choisissez "JSON" dans le menu déroulant.
    • Entrez le contenu de la requête en JSON. Par exemple :
{
"title": "joliciel",
"body": "ceci est un test",
"userId": 1
}
  1. Envoyer la requête :

    • Cliquez sur "Send" pour envoyer la requête à l'API.
  2. Analyser la réponse :

    • Ligne de statut : Vérifiez la ligne de statut pour vous assurer que la requête a été traitée avec succès (par exemple, "HTTP/1.1 201 Created").
    • En-têtes de réponse : Examinez les en-têtes pour obtenir des informations sur le serveur et le type de contenu.
    • Corps de la réponse : Regardez le corps de la réponse, qui devrait contenir les données que vous avez envoyées, souvent avec un identifiant ajouté.

Résultats attendus

  • Ligne de statut : Vous devriez voir "HTTP/1.1 201 Created", indiquant que la ressource a été créée avec succès.
  • En-têtes de réponse : Ceux-ci incluront des informations comme "Content-Type", qui devrait être "application/json".
  • Corps de la réponse : Vous verrez un objet JSON contenant les données que vous avez envoyées, avec un nouvel identifiant.

Analyse des résultats

  • Ligne de statut : Confirmez que le statut est 201, ce qui signifie que la ressource a été créée.
  • En-têtes de réponse : Notez le "Content-Type", confirmant que le format de la réponse est JSON.
  • Corps de la réponse : Vérifiez que les données envoyées sont retournées avec un nouvel identifiant, indiquant que l'opération POST a réussi.

4) Vérifier la donnée créée (Postman)

Pour vérifier la donnée créée avec une autre requête API dans Postman, vous pouvez suivre ces étapes :

  1. Identifier l'ID de la ressource créée :

    • Après avoir envoyé votre requête POST, notez l'identifiant (id) de la ressource retournée dans le corps de la réponse.
  2. Créer une nouvelle requête GET :

    • Dans Postman, cliquez sur "New" et sélectionnez "Request".
    • Nommez la requête, par exemple "Get Created Post".
  3. Configurer la requête GET :

    • Dans la barre d'adresse, entrez l'URL de l'API en ajoutant l'ID de la ressource à la fin. Par exemple, pour jsonplaceholder.typicode.com, si l'ID est 101, l'URL sera https://jsonplaceholder.typicode.com/posts/101.
    • Assurez-vous que le type de requête est "GET".
  4. Envoyer la requête :

    • Cliquez sur "Send" pour envoyer la requête à l'API.
  5. Analyser la réponse :

    • Ligne de statut : Vérifiez que la requête a été traitée avec succès (par exemple, "HTTP/1.1 200 OK").
    • Corps de la réponse : Assurez-vous que les données retournées correspondent à celles que vous avez envoyées dans votre requête POST.

Résultats attendus

  • Ligne de statut : Vous devriez voir "HTTP/1.1 200 OK", indiquant que la requête a réussi.
  • Corps de la réponse : Vous devriez voir les données de votre ressource, confirmant que la création a été effective.

Exemple de Vérification

Si vous avez créé une ressource avec :

{
"title": "joliciel",
"body": "ceci est un test",
"userId": 1
}

Après votre requête GET, le corps de la réponse devrait ressembler à ceci :

{
"id": 101,
"title": "joliciel",
"body": "ceci est un test",
"userId": 1
}

5) Installer Curl sous Windows

Curl est un outil en ligne de commande qui permet de transférer des données via divers protocoles, dont HTTP et HTTPS. Il est très utile pour envoyer des requêtes HTTP depuis un terminal, notamment pour tester des API.

Étapes pour installer Curl sous Windows

  1. Vérifier si Curl est déjà installé :

    • Avant d'installer Curl, vérifiez s'il est déjà disponible sur votre système. Ouvrez l'invite de commandes (tapez cmd dans la barre de recherche Windows) et tapez la commande suivante :
      curl --version
    • Si Curl est installé, vous verrez des informations sur la version installée. Sinon, vous devrez suivre les étapes ci-dessous pour l'installer.
  2. Télécharger Curl :

    • Accédez au site officiel de Curl : https://curl.se/windows/.
    • Sous la section "Win64 - Generic", téléchargez la version appropriée de Curl (généralement l'archive "With SSL").
    • Choisissez l'archive .zip pour une installation manuelle.
  3. Décompresser l'archive :

    • Une fois le fichier téléchargé, faites un clic droit sur l'archive .zip et sélectionnez "Extraire tout". Décompressez-le dans un dossier de votre choix, par exemple C:\curl.
  4. Configurer les variables d'environnement :

    • Pour utiliser Curl depuis n'importe quel répertoire dans votre terminal, vous devez ajouter son chemin dans les variables d'environnement :
      1. Ouvrez le Panneau de configuration, puis accédez à Système.
      2. Cliquez sur Paramètres système avancés et ensuite sur Variables d'environnement.
      3. Dans la section Variables système, sélectionnez la variable Path et cliquez sur Modifier.
      4. Ajoutez le chemin du dossier où vous avez décompressé Curl (par exemple, C:\curl\bin), puis cliquez sur OK.
  5. Vérifier l'installation :

    • Ouvrez une nouvelle invite de commandes (cmd) et tapez à nouveau :
      curl --version
    • Vous devriez voir les informations de version de Curl, confirmant que l'installation a réussi.

6) Requête POST (Curl)

Une fois Curl installé, vous pouvez l'utiliser pour envoyer une requête POST à une API.

Nous allons réutiliser l'API de test utilisée plus tôt dans ce TP : https://jsonplaceholder.typicode.com/posts.

Objectif

Envoyer une requête POST avec Curl pour créer une nouvelle ressource via une API.

Étapes à suivre

  1. Ouvrir l'invite de commandes :

    • Appuyez sur Win + R, tapez cmd, puis appuyez sur Entrée pour ouvrir l'invite de commandes.
  2. Préparer la commande POST :

    • La syntaxe de base pour une requête POST avec Curl est la suivante :

      curl -X POST [URL] -d "[DATA]"
    • Nous allons utiliser cette syntaxe pour envoyer une requête à l'API jsonplaceholder en ajoutant un corps JSON. Par exemple, pour créer un nouveau post avec un titre et un contenu, la commande complète sera :

      curl -X POST https://jsonplaceholder.typicode.com/posts -d "{'title':'joliciel', 'body':'ceci est un 2ème test', 'userId':1}"
  3. Analyser la réponse :

    • Après avoir exécuté cette commande, vous recevrez une réponse de l'API sous forme d'un objet JSON. Ce JSON contient les données que vous avez envoyées, ainsi qu'un nouvel identifiant (id) ajouté par l'API pour la nouvelle ressource créée.

      Voici à quoi la réponse pourrait ressembler :

      {
      "title": "joliciel",
      "body": "ceci est un 2ème test",
      "userId": 1,
      "id": 102
      }
    • Le champ id est important car il est utilisé pour vérifier que la ressource a bien été créée.

Résultats attendus

  • Ligne de statut : Bien que Curl ne montre pas directement la ligne de statut, vous pouvez ajouter l'option -i pour inclure les en-têtes HTTP dans la réponse. Par exemple :

    curl -i -X POST https://jsonplaceholder.typicode.com/posts -d "{'title':'joliciel', 'body':'ceci est un 2ème test', 'userId':1}"

    Cela vous permettra de voir une ligne de statut comme HTTP/1.1 201 Created.

  • Corps de la réponse : Le corps de la réponse sera en JSON et contiendra les données que vous avez envoyées, ainsi que l'id généré.


7) Vérifier la donnée créée (Curl)

Après avoir envoyé une requête POST, vous pouvez utiliser une requête GET pour vérifier que la ressource a bien été créée et est disponible via l'API.

Objectif

Utiliser Curl pour envoyer une requête GET afin de vérifier la ressource que vous venez de créer.

Étapes à suivre

  1. Identifier l'ID de la ressource créée :

    • Après l'envoi de la requête POST, notez l'id de la ressource qui a été retourné dans le corps de la réponse. Dans notre exemple, l'id est 101.
  2. Envoyer une requête GET :

    • Pour récupérer cette ressource spécifique, nous allons envoyer une requête GET en utilisant l'URL de l'API suivie de l'id de la ressource. Par exemple :
      curl https://jsonplaceholder.typicode.com/posts/102
  3. Analyser la réponse :

    • Vous recevrez en réponse un objet JSON contenant les informations de la ressource. Cela devrait correspondre aux données que vous avez envoyées dans la requête POST, par exemple :

      {
      "{'title':'joliciel', 'body':'ceci est un 2ème test', 'userId':1}": "",
      "id": 102
      }

Résultats attendus

  • Ligne de statut : Comme pour la requête POST, vous pouvez inclure l'option -i pour afficher la ligne de statut :

    curl -i https://jsonplaceholder.typicode.com/posts/102

    Vous devriez voir une ligne de statut comme HTTP/1.1 200 OK, indiquant que la requête GET a réussi et que la ressource existe bien.

  • Corps de la réponse : Le corps de la réponse doit contenir les données de la ressource que vous avez créée. Vous pourrez ainsi vérifier que la création de la ressource a bien été effectuée avec succès.


Nous allons maintenant nous intéresser au fonctionnement des applications Web...