Requête GET – Etude d’une requête Client avec Python

Hello world

Lorsque vous tapez l’adresse d’un site web (http://www.google.fr) sur votre navigateur favori, celui-ci envoie des requêtes GET au serveur web du site afin de recevoir en réponses les fichiers nécessaires à la construction de la page web.

Je vous propose dans cet article de simuler une requête GET avec un programme simple (comme un vrai navigateur ! :)) et d’observer la réponse du serveur.

Logiciels requis :

Principe

Le protocole HTTP se repose sur une liaison point à point serveur client à travers le réseau internet. Le client envoie au serveur (aussi appelé hôte) une requête (de type GET, POST, …). Le serveur lui renvoie une réponse appropriée.

Vous pouvez apercevoir à travers les codes python ci-dessous les échanges en clair entre serveur et client pour une simple demande de page web (HTTP et CSS)

Requète GET simplifiée

Code

Vous avez ci-dessous 4 codes. Les deux premiers codes sont des fichiers HTML et CSS à mettre dans le dossier tests (à créer) du dossier racine www de votre Serveur Web local installé avec WAMP.

Les deux codes suivants correspondent à deux simulations de clients web écrits en Python. Leur but est :

  • D’établir une session TCP avec votre serveur web local (localhost:8080).
  • Puis d’envoyer au serveur des requêtes GET (http://localhost:8080/tests/...)

Pour résumer :

  • Partie Serveur web (WAMP)
    • Le 1e code contient le contenu d’une page HTML basique
    • Le 2e code contient le contenu d’une page CSS basique
  • Partie Client web Python
    • Le 3e code simule la requête GET d’une page HTTP simple
    • Le 4e code simule la requête GET des 2 pages, d’abord HTTP, puis CSS

Pour simuler une requête GET à partir de notre client écrit en Python, vous devez :

  1. Installer le serveur web WAMP
  2. Placer les fichiers HTML et CSS dans un sous-dossier tests de la racine www
  3. Exécutez le client web de votre choix (code 3 ou 4) avec un IDE python

Une fois le « client » lancé, des échanges s’effectuent entre lui et le serveur. Puis le « client web » s’arrête une fois qu’il a reçu ses fichiers. Vous pouvez alors observer dans la fenêtre de commandes python la réponse du serveur.


GoodNight Moon

Serveur – HTMLServeur – CSSClient – requête fichier HTMLClient – requête fichiers HTML et CSS
<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Voici mon site</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
        <!-- Ceci est un commentaire de code, il ne s'affiche pas --> 
        <h1>Hello World! Ceci est un titre</h1>
        <p>Ceci est un <strong>paragraphe</strong>. Avez-vous bien compris è_é?</p>
    </body>
</html>
/* Ceci est un commentaire de code, il ne s'affiche pas */

p {
    color: blue;
  }
# -*- coding: utf-8 -*-
# Librairies
import socket


#Parametres réseau
hote = "localhost"   #Vide pour localhost
port = 8080


#Page web HTTP avec en entête la réponse supposée de la requete client
get_html = "\
GET /tests/ HTTP/1.1\r\n\
Host: localhost:8080\r\n\
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n\
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3\r\n\
Accept-Encoding: gzip, deflate\r\n\
Connection: keep-alive\r\n\
Upgrade-Insecure-Requests: 1\r\n\
Cache-Control: max-age=0\r\n\
\r\n"

   
#Conversion en UTF-8
print("\ncontenu page HTML :\n" + get_html)
bytesGetHtml = get_html.encode(encoding='UTF-8')


#Initialisation client socket et demande de connexion au port
print("Démarrage du serveur socket")
connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connexion_avec_serveur.connect((hote, port))
print("Connexion établie avec le serveur sur le port {}".format(port))


#Requète GET page HTML après la connexion
print("\n\nDemande de la page HTML (requète GET) ... ")
connexion_avec_serveur.send(bytesGetHtml)
msg_recu = connexion_avec_serveur.recv(1024)
print(msg_recu.decode()) # Là encore, peut planter s'il y a des accents


#Arrêt du serveur
print("Fermeture de la connexion avec le serveur")
connexion_avec_serveur.close()

# -*- coding: utf-8 -*-
# Librairies
import socket


#Parametres réseau
hote = "localhost"   #Vide pour localhost
port = 8080


#Page web HTTP avec en entête la réponse supposée de la requete client
get_html = "\
GET /tests/ HTTP/1.1\r\n\
Host: localhost:8080\r\n\
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n\
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3\r\n\
Accept-Encoding: gzip, deflate\r\n\
Connection: keep-alive\r\n\
Upgrade-Insecure-Requests: 1\r\n\
Cache-Control: max-age=0\r\n\
\r\n"


#Page web CSS avec en entête la réponse supposée de la requete client
get_css = "GET /tests/styles.css HTTP/1.1\r\n\
Host: localhost:8080\r\n\
Connection: keep-alive\r\n\
Sec-Fetch-Dest: style\r\n\
Accept: text/css,*/*;q=0.1\r\n\
Sec-Fetch-Site: same-origin\r\n\
Sec-Fetch-Mode: no-cors\r\n\
Referer: http://localhost:8888/\r\n\
Accept-Encoding: gzip, deflate, br\r\n\
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7\r\n\
\r\n"

   
#Conversion en UTF-8
print("\ncontenu page HTML :\n" + get_html)
print("\ncontenu page CSS  :\n" + get_css)
bytesGetHtml = get_html.encode(encoding='UTF-8')
bytesGetCss  = get_css.encode(encoding='UTF-8')


#Initialisation client socket et demande de connexion au port
print("Démarrage du serveur socket")
connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connexion_avec_serveur.connect((hote, port))
print("Connexion établie avec le serveur sur le port {}".format(port))


#Requète GET page HTML après la connexion
print("\n\nDemande de la page HTML (requète GET) ... ")
connexion_avec_serveur.send(bytesGetHtml)
msg_recu = connexion_avec_serveur.recv(1024)
print(msg_recu.decode()) # Là encore, peut planter s'il y a des accents


#Requète GET page CSS associée après la connexion
print("\n\nDemande de la page CSS associée (requète GET) ... ")
connexion_avec_serveur.send(bytesGetCss)
msg_recu = connexion_avec_serveur.recv(1024)
print(msg_recu.decode()) # Là encore, peut planter s'il y a des accents


#Arrêt du serveur
print("Fermeture de la connexion avec le serveur")
connexion_avec_serveur.close()

Liens

Liens internes

  • Savoirs requis
    • Python (Librairie Socket)
    • Internet (TCP, HTTP, Requètes)
  • Logiciel
    • Python

Liens externes

  • https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/234698-gerez-les-reseaux

Votez cet article :

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?

Laisser un commentaire