# Le dialogue client-serveur sur le Web
<br><br>
*Ce document a été créé en collaboration avec ChatGPT, qui a été utilisé pour transposer le cours correspondant (accessible [ici](dialogue-client-serveur)) en un diaporama.
Pour voir la conversation [cliquez ici](https://chat.openai.com/share/ab8d3d96-8b9f-45be-8af6-11b84108e606).*
---
## Le modèle client-serveur
- Sur Internet, deux catégories d'ordinateurs :
- **clients** : ordinateurs des internautes.
- **serveurs** (Web) : ordinateurs puissants stockant et délivrant des sites Web.
<img class="centre image-responsive" src="data/client-server-model.svg" alt="modèle client-serveur" width="350">
<small>**Fig. 1 - Le modèle client-serveur.**
<br>Crédits : [David Vignoni](https://commons.wikimedia.org/wiki/File:Client-server-model.svg), LGPL, via Wikimedia Commons
</small>
---
## Le modèle client-serveur (suite)
Le World Wide Web utilise le **modèle client-serveur** :
- *clients* envoient des *requêtes*.
- *serveurs* attendent et répondent aux requêtes.
C'est le **protocole HTTP** (ou HTTPS) qui régit cet échange client-serveur.
---
## HTTP, le protocole du Web
**HTTP** (*HyperText Transfer Protocol*) : protocole client-serveur définissant les messages entre navigateur (*client*) et serveur Web (*serveur*).
<img class="centre image-responsive" src="data/requete-reponse.png" alt="requête et réponse">
<small>**Fig. 2 - Requête et réponse HTTP.**</small>
----
### Déroulé d'une interaction client-serveur
1. Le navigateur Web **isole le nom du serveur** dans l'URL saisie par l'utilisateur
2. Le navigateur Web effectue une **requête DNS** pour obtenir l’**adresse IP du serveur**
3. Le navigateur Web se **connecte à la machine du serveur**
4. Le navigateur Web effectue la **requête HTTP** conformément au protocole HTTP (ou HTTPS)
5. Le serveur **répond** en envoyant la ressource demandée (ou un message d'erreur)
---
## Requête HTTP et réponse du serveur
----
### ✏️ Activité 1
Pour analyser les requêtes et les réponses HTTP entre client et serveur.
Faites l'activité 1 : [Analyse des requêtes et réponses HTTP](activite-requetes-reponses-http)
---
### Requête HTTP
Syntaxe :
- *Ligne de commande* (1ère ligne) : méthode, URL, version du protocole.
- *En-têtes* : infos sur le client, serveur, type de document demandé.
- *Corps* de la requête (peut être vide)
Exemple :
```http
GET /premiere_nsi/essai.html HTTP/1.1
Host: info-mounier.fr
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
...
```
----
#### Méthodes de requête HTTP
Principales méthodes :
- `GET` : demande une ressource (non modifiante).
- `HEAD` : demande des infos sur la ressource.
- `POST` : soumet des données au serveur (via un formulaire --> chapitre suivant)
---
### Réponse HTTP
Syntaxe :
- *Ligne de statut* (1ère ligne) : version du protocole, code et texte réponse.
- *En-têtes* : type de document, serveur, cookies, etc.
- *Corps* de la réponse (= code HTML si c'est une page Web qui est demandée) : séparé des en-têtes par une ligne vide
Exemple :
```http
HTTP/1.1 200 OK
Content-Type: text/html
Date: Sun, 06 Feb 2022 10:59:26 GMT
... autres en-têtes
<!DOCTYPE html>
<html lang="fr">
<head>
...
```
----
#### Codes de réponse HTTP
Quelques codes :
- `200` : succès, ressource disponible.
- `404` : ressource introuvable.
- `403` : accès refusé.
- `500` : erreur interne du serveur.
---
## Échanges chiffrés avec HTTPS
- **Problème HTTP** : données échangées "en clair".
- Solution : **HTTPS** (*HyperText Transfer Protocol Secure*) = combinaison de HTTP et d'un protocole de sécurisation (SSL ou TLS --> programme de Terminale).
- Pages chiffrées commencent par `https://`.
---
# Passage de paramètres à un site
---
## Site statique vs. site dynamique
----
### Site statique
- Utilise HTML, CSS, JavaScript.
- Tous les clients reçoivent le même contenu.
- Adapté pour des sites "vitrine".
![site web statique](data/site_statique.png)
<small>**Fig. 3 - Cas d'un site statique.**
<br><br>Crédits : OpenClassrooms, Mathieu Nebra & Mickaël Andrieu,
<br>Cours <a href="https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/4237646-decouvrez-le-fonctionnement-dun-site-ecrit-en-php">Concevez votre site web avec PHP et MySQL</a> diffusé sous licence CC BY-SA.
</small>
----
### Site dynamique
- Réalisé avec langages côté serveur (PHP, Python, Ruby, JavaScript, etc.)
- Fabrication de pages en fonction d'infos utilisateur.
- Les clients ne reçoivent pas le même contenu en réponse
![site web dynamique](data/site_dynamique.png)
<small>**Fig. 4 - Cas d'un site dynamique.**
<br><br>Crédits : OpenClassrooms, Mathieu Nebra & Mickaël Andrieu,
<br>Cours <a href="https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/4237646-decouvrez-le-fonctionnement-dun-site-ecrit-en-php">Concevez votre site web avec PHP et MySQL</a> diffusé sous licence CC BY-SA.
</small>
---
## Fabrication d'une page par le serveur
- Pages fabriquées côté serveur avec langages comme Python, PHP, etc.
- Pages fabriquées en fonction de données de l'utilisateur
- Ces données peuvent être transmises :
- via l'URL
- via un formulaire (chapitre suivant)
----
### Construction d'une page Web par un serveur
### ✏️ Activité 2
Pour voir comment un serveur peut construire une page Web à envoyer au client.
Faites l'activité 2 : [Découverte du framework Flask](activite-decouverte-flask).
----
### Passages de paramètres via l'URL
**Format d'une URL avec paramètres**
```protocole://adresse/chemin?n1=v1&n2=v2```
- Paramètres écrits après un `?`
- Les paramètres (`ni`) et leur valeurs (`vi`) sont transmis sous la forme `ni=vi` séparés par un esperluette `&`
----
### ✏️ Activité 3
Pour voir comment le serveur peut récupérer des paramètres transmis dans l'URL pour construire la page de réponse.
- Activité 3 : [Transmettre des paramètres dans l'URL](activite-passage-parametres-url).
---
## Exemple bilan
Supposons qu'un navigateur fasse une requête pour accéder à :
```http://www.info-mounier.fr/premiere_nsi/essai.html```
1. **Le navigateur Web isole le nom du serveur**: il extrait `www.info-mounier.fr` de l'URL.
<!-- .element: class="fragment" -->
2. **Le navigateur Web effectue une requête DNS pour obtenir l’adresse IP du serveur**:
- Effectue une requête DNS pour obtenir l'adresse IP correspondant à `www.info-mounier.fr`. Par exemple, `2001:8d8:100f:f000::20e` en IPv6.
<!-- .element: class="fragment" -->
----
## Exemple bilan (suite)
3. **Le navigateur Web se connecte à la machine du serveur**:
- Utilise le protocole TCP sur le port 80 pour se connecter à la machine avec l'adresse IP obtenue.
<!-- .element: class="fragment" -->
4. **Le navigateur Web effectue la requête HTTP**:
- Envoie une requête au serveur, par exemple :
```http
GET /premiere_nsi/essai.html HTTP/1.1
Host: info-mounier.fr
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
...
```
<!-- .element: class="fragment" -->
----
## Exemple bilan (suite)
5. (**Le serveur fabrique la page web** à partir des données de l'utilisateur transmises via l'URL ou un formulaire) dans le cas d'un site dynamique
<!-- .element: class="fragment" -->
6. **Le serveur répond en envoyant la ressource demandée**:
- Si la connexion est établie, le serveur envoie la réponse avec le contenu de la page Web demandée, par exemple :
```http
HTTP/1.1 200 OK
Content-Type: text/html
Date: Sun, 06 Feb 2022 10:59:26 GMT
... autres en-têtes
<!DOCTYPE html>
<html lang="fr">
<head>
...
```
<!-- .element: class="fragment" -->
---
# Bilan
- **Protocole HTTP** assure échanges client-serveur.
- **Sites dynamiques** : serveur fabrique pages selon infos utilisateur.
- Paramètres transmis au serveur via URL ou formulaires.
- Sécuriser avec **HTTPS**.
- Exemple avec **Flask** (activités 2 et 3).
---
**Références** :
- Manuel *Numérique et Sciences Informatiques*, niveau Première, T. Balabonski, S. Conchon, J.-C. Filliâtre, K. Nguyen, éditions Ellipses.
- [Wikipédia - protocole HTTP](https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol).
- Cours [OpenClassrooms - Concevez votre site Web avec PHP et MySQL](https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/4237646-decouvrez-le-fonctionnement-dun-site-ecrit-en-php).
---
Germain BECKER & Sébastien POINT, Lycée Emmanuel Mounier, ANGERS
![Licence Creative Commons](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)