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 :
- IDE python (J’utilise Spyder inclus dans Anaconda sur Windows)
- Serveur Web Apache ou NGINX (j’utilise WampServeur)
- Éditeur de fichiers texte (j’utilise NotePad++)
- Navigateur (Firefox, Chrome, Edge, Opéra, …)
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)
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 :
- Installer le serveur web WAMP
- Placer les fichiers HTML et CSS dans un sous-dossier
testsde la racinewww - 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
<!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
