=========================== Le protocole HTTP et WSGI =========================== .. role:: lat Rappels sur le Web ================== Web ≠ Internet -------------- Internet est ensemble de réseaux informatiques locaux utilisant les mêmes protocoles de bas niveau standards (TCP/IP) et formant un réseau global. .. figure:: InternetMonde.* Image © portices.fr__ __ http://www.portices.fr/formation/Res/Internet/Res/InternetMonde.gif .. note:: Le Web est *l'une* des applications d'internet, et la plus populaire, d'où l'amalgamme souvent fait entre les deux. Qu'est-ce que le Web ? ---------------------- Un espace documentaire décentralisé, interconnecté et interopérable. .. rst-class:: build * décentralisé → **HTTP** * interconnecté → **URL** * interopérable → **HTML** .. note:: Ces technologies peuvent bien sûr évoluer (elle l'ont déjà fait), voire être à terme remplacées par d'autres. Ce ne sont pas elles qui définissent le Web, mais les 3 propriétés qu'elles lui confèrent. Architecture du Web =================== Architecture Client-Serveur --------------------------- * **Ressource**: toute unité d'information (document, image, vidéo, données...) accessible sur le Web, **identifiée par une URL** * **Serveur**: un ordinateur « contenant » des ressources, toujours connecté à Internet. * **Client**: un ordinateur/smartphone/tablette... utilisé pour **exploiter** des ressources. .. figure:: client-server.* :height: 8ex Source image http://commons.wikimedia.org/wiki/File:Client-server-model.svg .. note:: * Les termes "client" et "serveur" identifient en fait des *rôles*. * Le même ordinateur peut jouer le rôle de client dans certaines situations, et de serveur dans d'autres situations. * Il est même possible d'avoir, sur un *même ordinateur*, un logiciel client et un logiciel serveur (c'est ce que nous ferons en TP). Identification des ressources ----------------------------- .. raw:: html :file: url-structure1.html * Le nom local a souvent une structure hiérarchique (similaire à la structure des fichiers). * Comme pour les fichiers, on peut spécifier une URL *relativement* à une autre : exemple : ``../algorithmique`` .. warning:: Malgré cette similitude, les ressources ne correspondent *pas toujours* à des fichiers. .. nextslide:: * Plus généralement, le nom local est composé de plusieurs parties, ayant des structures différentes. Son interprétation est du ressort *du serveur*. .. raw:: html :file: url-structure2.html * *Chaque* URL désigne une **ressource différente** (même lorsqu'elle ne diffère que par les paramètres, par exemple) Rôles du serveur ---------------- * Est garant de l'état des ressources, * pour en fournir une *représentation* aux clients qui le demandent (GET), * mais aussi pour les *modifier* en réponse à certaines requêtes (POST), par exemple : - commande sur un site marchand, - message posté sur un réseau social, - `etc`:lat:... .. important:: L'état d'une ressource n'est pas forcément stocké dans un fichier. Souvent, il est stocké dans une base de données ; la représentation HTML (ou autre) de la ressource est calculée par le serveur. Rôles du client --------------- * Interprète les représentation envoyées par le serveur (pour les afficher, mais pas uniquement) * Gère la navigation en interne * Gère les interactions avec le serveur : - clics sur des liens, - formulaires, - `etc`:lat:... Message HTTP ============ Principe -------- HTTP est basé sur l'échange de **messages** : * le client envoie un message *requête*, * le serveur retourne un message *réponse*. Chaque échange est indépendant des autres (messages auto-suffisants). Structure générale ------------------ .. image:: envelope.svg Structure d'une requête ----------------------- * Première ligne - verbe - identifiant local de la ressource - version du protocole HTTP * En-têtes (suivis d'une ligne vide) * Contenu facultatif (selon le verbe) Exemples de requêtes -------------------- .. rst-class:: request .. code-block:: http :emphasize-lines: 1 GET /france/lyon HTTP/1.1 Host: meteo.example.org User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 Accept: text/html,application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: UTF-8,* Connection: keep-alive Keep-Alive: 300 (pas de contenu) ---- .. nextslide:: :increment: .. rst-class:: request .. code-block:: http :emphasize-lines: 1 GET /france?ville=lyon HTTP/1.1 Host: meteo.example.org User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 Accept: text/html,application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: UTF-8,* Connection: keep-alive Keep-Alive: 300 (pas de contenu) ---- .. nextslide:: :increment: .. rst-class:: request .. code-block:: http :emphasize-lines: 1 POST /passer-commande HTTP/1.1 Host: marchand.example.org User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 Accept: text/html,application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: UTF-8,* Connection: keep-alive Keep-Alive: 300 Content-Type: application/x-www-form-urlencoded Content-Length: 12345 nom=PA+Champin&addresse=12+rue+Turing&articles=... .. note:: * On retrouve dans la requête la structure de l'URL (nom du serveur, nom local de la ressource) * Notez que les deux premières requêtes sont identiques, à l'exception du nom local. Structure d'une réponse ----------------------- * Première ligne - version du protocole HTTP - code de statut - libellé textuel * En-têtes (suivis d'une ligne vide) * Contenu facultatif (selon le code de statut) Exemples de réponse ------------------- .. rst-class:: response .. code-block:: http :emphasize-lines: 1 HTTP/1.1 200 OK Date: Mon, 02 Jan 2016 22:46:26 GMT Server: Apache/2 Accept-Ranges: bytes Content-Type: text/html; charset=utf-8 Content-Length: 29794 Etag: "7462-477341dcfb940;89-3f26bd17a2f00" Last-Modified: Mon, 02 Jan 2016 12:00:00 GMT Content-Location: Home.html Vary: negotiate,accept Cache-Control: max-age=600 Expires: Mon, 02 Nov 2009 22:56:26 GMT Connection: close