# Modèle Client-Serveur <br> Février 2022
---
## Rappels
----
:::info
Quel langage permet de décrire **le fond** d'une page web ?
:::
:::success
Le langage HTML pour *HyperText Markup Language*
permet de décrire **le contenu** d'une page web.
<!-- .element: class="fragment" -->
:::
----
:::info
Quel langage permet de décrire **la forme** d'une page web ?
- Le JavaScript
- Le CSS <!-- .element: class="fragment highlight-green" -->
- Le C
- Le Python
:::
----
:::info
Qui **interprète** le HTML,CSS et JS ?
* Le navigateur <!-- .element: class="fragment highlight-green" -->
* L'interpréteur python
* Le serveur web
:::
---
## Le modèle Client-Serveur
Pour obtenir une **page web** le navigateur (*client*) émet une **requête** au *serveur web*.
Ensuite, le *serveur* répond avec un **contenu** sous forme de **code HTML,CSS,Javascript**.
<!-- .element: class="fragment fade-in" -->
Enfin, le *client* (navigateur) **interpréte ces codes** pour permettre de:
<!-- .element: class="fragment fade-in" -->
* la visualiser <!-- .element: class="fragment fade-in" -->
* interagir avec les élèments (JS et CSS) <!-- .element: class="fragment fade-in" -->
* <!-- .element: class="fragment fade-in" --> interagir avec les formulaires (Requêtes HTTP).
----
![Illustration du modèle client serveur avec une utilisatrice, un navigateur et un serveur pour récupérer une page web et l'utiliser](https://minio.apps.education.fr/codimd-prod/uploads/upload_8057fec31c0b988e1aa3d53af56937a2.png)
----
### Pages web complexes
Une page web est constitué de **plusieurs fichiers**.
:::warning
Chaque fichier occasionne **une requête HTTP** au serveur web.
Une page web **nécessite plusieurs requêtes** pour être *complète*.
:::
---
## Notion d'URL
Pour accéder à une page *web* on doit utiliser **une URL[^1]**.
Une **URL** identifie donc **une ressource** sur le web (vidéo, texte, fichier PDF, ...).
[^1]: Uniform Resource Locator
----
### Format d'une URL
![L'URL <span>https://nsi.codeberg.page:80/premiere/arch?arg=1</span> détaillée en <span>protocole://nom:port/chemin/ressource?arguments=valeur</span>](https://minio.apps.education.fr/codimd-prod/uploads/upload_779e4191b1a625eed5ae58f51a7d3acf.png)
| Champ | Description |
| ------------- |:------------------------------------------ |
| Protocole | **Comment** récupérer |
| Nom / Adresse | **Où** sur le web |
| Port | **Où** sur le serveur |
| Ressource | **Quoi** sur le serveur |
| Paramètres | Des arguments si la page est **dynamique** |
---
# Pause
## 5 minutes
:sleeping:
---
## Requêtes HTTP
Pour communiquer des pages web en **HTML** désignées par des **URL** on utilise le protocole **HTTP**.
**HTTP** se base sur des **requêtes** et des **réponses**.
:::success
Requête: Message envoyé par le client pour obtenir une ressource.
Réponse: Message envoyé par le serveur pour donner la ressource au client.
:::
----
### Exemple de dialogue
Un vrai dialogue depuis le terminal
```bash
curl https://nsi.codeberg.page/premiere/ -v -s -o /dev/null 2>&1 | grep -v '^[*\{\}]'
```
----
### Format d'une requête HTTP
>*type* *ressource* HTTP/*version*
>Host: *nom de domaine ou adresse*
>User-Agent: *valeur client*
>*Champ*: *valeur*
>...
>**contenu**
<!-- .element: style="text-align: left" -->
----
### Format d'une réponse HTTP
>HTTP/*version* *code de retour*
>Date: *la date du serveur*
>Content-type: ...
>Content-length: ...
>*Champ*: *valeur*
>
<!-- .element: style="text-align: left" -->
----
### Les différents types de requêtes
Pour une liste exhaustive : <https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol>
| Type | Description |
| ---- |:---------------------------------------------------------------------- |
| GET | La plus courante, pour demander une ressource. |
| HEAD | Demande des informations sur la ressource, sans demander la ressource. |
| POST | Utilisée pour transmettre des données |
----
### Les codes de retour:
| Ensembles de code | Description |
|:----------------- | -------------------------- |
| 1xx | Information sur la requête |
| 2xx | La requête a abouti |
| 3xx | Redirection de page |
| 4xx | Erreur du **client** |
| 5xx | Erreur du **serveur** |
---
## Les formulaires
Pour transmettre des informations au serveur on utilise:
* Les requêtes GET (non sécurisées)
* Les requêtes POST (sécurisées si la connexion l'est)
----
### Les requêtes GET
On transmet les informations dans l'URL **via la partie paramêtres**.
Voir le *serveur2.py*.
----
### Les requêtes POST
Les informations sont transmises **dans le corps de la requête**.
Voir le *serveur3.py*.
---
# Pour demain
* Exercice suivant de france-ioi
{"tags":"cours, nsi, web, client, serveur, http","title":"Modèle Client-Serveur et protocole HTTP","type":"slide","slideOptions":{"theme":"beige","disableLayout":false}}