Requête GET – Etude d’une réponse Serveur 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 demandé afin de recevoir en réponses les fichiers nécessaires à la construction de la page web.

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

Logiciel requis :

  • IDE python (J’utilise Spyder inclus dans Anaconda sur Windows)

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

Les deux codes ci-dessous représentent chacun un serveur web simple. Ces deux serveurs web minimalistes sont construits à partir d’un simple serveur TCP (appelé ici socket) :

  • Le serveur web du 1e code héberge une page web HTML
  • Le serveur web du 2e code héberge une page web HTML et CSS

Pour activer le serveur de votre choix, il vous suffit de :

  • Exécuter le code correspondant dans un IDE python (ex : spyder de Anaconda)
  • Tapez sur le navigateur de votre choix l’URL http://localhost:8888/

Une fois l’URL rentrée, des échanges se produisent entre le serveur et le navigateur. Puis le serveur se ferme (le code python s’arrête) et la page s’affiche dans le navigateur. Vous pouvez alors observer dans la console python de l’IDE les requêtes envoyées par le navigateur dès l’URL rentrée (le client).

Si vous souhaitez à nouveau relancer la page, vous devez d’abord relancer le code serveur

GoodNight Moon

Serveur Python – HTMLServeur Python – HTML et CSS
# -*- coding: utf-8 -*-
# Librairies
import socket
import time


#Paramètres réseau
hote = ''   #Vide pour localhost
port = 8888


#Page web HTML avec en entête la réponse supposée de la requête client
html = "\
HTTP/1.1 200 OK\r\n\
Connection: close\r\n\
Content-Type: text/html\r\n\
\r\n\
<!doctype html>\r\n\
<html lang=\"fr\">\r\n\
    <head>\r\n\
        <meta charset=\"utf-8\">\r\n\
        <title>Voici mon site</title>\r\n\
    </head>\r\n\
    <body>\r\n\
        <h1>Hello World! Ceci est un titre</h1>\r\n\
        <p>Ceci est un <strong>paragraphe</strong>. Avez-vous bien compris ?</p>\r\n\
    </body>\r\n\
</html>\r\n"

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


#Initialisation serveur socket et écoute du port
print("\nDémarrage du serveur socket")
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveur.bind((hote, port))
serveur.listen(5)
print("Le serveur écoute à présent sur le port {}".format(port))


#Envoi page HTML dès la 1e demande de connexion TCP au port du serveur
print("\n\nAttente d'un client avant l'envoi du fichier HTML ... ")
client_recu, infos_connexion = serveur.accept()
requete = client_recu.recv(1024)
print("Client connecté, message reçu en TCP : \n" + requete.decode())
print("message reçu non décodé : \n")
print(requete)
print("\n\n")
time.sleep(1)
client_recu.send(bytesHtml)
client_recu.close()


#Arrêt du serveur
print("Arrêt du serveur")
serveur.close()
# -*- coding: utf-8 -*-
# Librairies
import socket
import time


#Paramètres réseau
hote = ''   #Vide pour localhost
port = 8888


#Page web HTML avec en entête la réponse supposée de la requête client
html = "\
HTTP/1.1 200 OK\r\n\
Connection: close\r\n\
Content-Type: text/html\r\n\
\r\n\
<!doctype html>\r\n\
<html lang=\"fr\">\r\n\
    <head>\r\n\
        <meta charset=\"utf-8\">\r\n\
        <title>Voici mon site</title>\r\n\
        <link rel=\"stylesheet\" href=\"styles.css\">\r\n\
    </head>\r\n\
    <body>\r\n\
        <h1>Hello World! Ceci est un titre</h1>\r\n\
        <p>Ceci est un <strong>paragraphe</strong>. Avez-vous bien compris ?</p>\r\n\
    </body>\r\n\
</html>\r\n"


#Page web CSS avec en entête la réponse supposée de la requête client
css = "\
HTTP/1.1 200 OK\r\n\
Connection: close\r\n\
Content-Type: text/css\r\n\
\r\n\
p {\r\n\
    color: blue;\r\n\
  }\r\n"

   
#Conversion en UTF-8
print("\ncontenu page HTML :\n" + html)
print("\ncontenu page CSS  :\n" + css)
bytesHtml = html.encode(encoding='UTF-8')
bytesCss  = css.encode(encoding='UTF-8')


#Initialisation serveur socket et écoute du port
print("\nDémarrage du serveur socket")
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveur.bind((hote, port))
serveur.listen(5)
print("Le serveur écoute à présent sur le port {}".format(port))


#Envoi page HTML dès la 1e demande de connexion TCP au port du serveur
print("\n\nAttente d'un client avant l'envoi du fichier HTML ... ")
client_recu, infos_connexion = serveur.accept()
requete = client_recu.recv(1024)
print("Client connecté, message reçu en TCP : \n" + requete.decode())
print("message reçu non décodé : \n")
print(requete)
print("\n\n")
time.sleep(1)
client_recu.send(bytesHtml)
client_recu.close()


#Envoi page CSS dès la 2e demande de connexion TCP au port du serveur
print("Attente d'un client avant l'envoi du fichier CSS associé ... ")
client_recu, infos_connexion = serveur.accept()
requete = client_recu.recv(1024)
print("Client connecté, message reçu en TCP : \n" + requete.decode())
print("message reçu non décodé : \n")
print(requete)
print("\n\n")
time.sleep(1)
client_recu.send(bytesCss)
client_recu.close()


#Arrêt du serveur
print("Arrêt du serveur")
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