Principes de base du CGI
Le Common Gateway Interface (CGI) constitue la technique traditionnelle pour pallier les deux inconvénients ci-dessus. L’idée de base est de produire les documents HTML par un programme qui est associé au serveur web. Ce programme recoit en outre des paramètres (comme l’année de parution des films) saisis par l’utilisateur. Le CGI est la solution la plus ancienne, et sans doute encore la plus utilisée, pour la gestion de sites web dynamiques. La programmation de sites web avec PHP s’appuie d’ailleurs, pour tous les échanges client/serveur, sur le protocole CGI. Le navigateur (client) envoie une requête (souvent à partir d’un formulaire HTML) qui est plus complexe que la simple demande de transmission d’un document. Cette requête consiste à faire déclencher une action (que nous désignins par programme CGI dans ce qui suit) sur le serveur. En d’autres termes, l’URL dans la page web référence, au lieu d’une page HTML, le nom du programme CGI qui doit se trouver (du moins sous UNIX) dans le répertoire cgi-bin. L’exécution du programme CGI par le serveur web se déroule en trois phases:
1. Requête du client au serveur: le programme serveur récupère les informations transmises par le navigateur, soit le nom du programme CGI accompagné, le plus souvent, de paramètres saisies par l’internaute dans un formulaire; 2. Exécution du programme CGI: le serveur déclenche l’exécution du programme CGI, en lui fournissant les paramètres recus ci-dessus; 3. Transmission du document HTML: le programme CGI renvoie le résultat de son exécution au serveur sous la forme d’un fichier HTML, le serveur se contentant alors de faire suivre au client.
Le programme CGI peut être écrit en n’importe quel langage (C, C++, Perl, script shell, etc) et est libre de faire toutes les opérations nécessaires pour satisfaire la demande (dans la limite de ses droits d’accès bien sur). Il peut notamment rechercher et transmettre des fichiers ou des images, effectuer des controles, des calculs, créer des rapports, etc. Il peut aussi accéder à une base de données pour insérer ou rechercher des informations. C’est ce dernier type d’utilisation, dans sa variante PHP/MySQL, que nous étudions dans ce livre. Avec le CGI, les communications entre serveur et client deviennent plus riches. Il faut décrire d’une part comment le client (navigateur) transmet des informations plus compliquées qu’une simple URL au serveur, et d’autre part comment le serveur joue son role de transmission entre le programme CGI et le navigateur.
Formulaires
Les formulaires constituent un moyen privilégié d’interaction puisqu’ils permettent à l’utilisateur d’entrer ses demandes par l’intermédiaire de champs de saisie, et de transmettre ces demandes au serveur. HTML propose un ensemble de balises pour définir des champs de saisie qui offrent la possibilité appréciable de créer très facilement une interface. La figure 2.7 montre un exemple de formulaire permettant la saisie de la description d’un film. Différents types de champs sont utilisés:
– Le titre et l’année sont des champs simples de saisie. L’utilisateur est libre d’entrer toute valeur alphanumérique de son choix. – Le pays producteur est proposé sous la forme d’une liste de valeurs prédéfinies. Le choix est de type exclusif: on ne peut cocher qu’une valeur à la fois. – Le genre est lui aussi présenté sous la forme d’une liste de choix imposés, mais ici il est possible de sélectionner plusieurs choix simultanément. – L’internaute peut transmettre au serveur un fichier contenant l’affiche du film, grace à un champ spécial qui offre la possibilité de choisir (bouton Browse) le fichier sur le disque local. – Une liste présentée sous la forme d’un menu déroulant propose une liste des metteurs en scène. – On peut entrer le résumé du film dans une fenêtre de saisie de texte. – Enfin, les boutons Valider ou Annuler sont utilisés pour, au choix, transmettre les valeurs saisies au progamme CGI, ou réinitialiser le formulaire. Cet exemple couvre pratiquement l’ensemble des types de champs disponibles. Nous décrivons en détail dans ce qui suit les balises de création de formulaires.
La balise form qui, outre les champs de saisie, peut contenir n’importe quel texte ou balise HTML. Les trois attributs suivants sont essentiels pour la communication du programme serveur avec un programme CGI:
– ACTION est la référence au programme qui doit être exécuté par le serveur; – METHOD indique le mode de transmission des paramètres au programme CGI. Il y a essentiellement deux valeurs possibles, GET ou POST; – ENCTYPE indique quel est le type d’encodage des données du formulaire qui doit être utilisé pour la transmission au serveur. Il y a deux valeurs possibles. 1. application/x-www-form-urlencoded. Il s’agit de l’option par défaut, utilisée même quand on ne donne pas d’attribut ENCTYPE. Les champs du formulaire sont transmis sous la forme d’une liste de paires nom=valeur, séparées par des ’&’. 2. multipart/form-data. Cette option doit être utilisée pour les transmissions comprenant des fichiers. Le mode de transmission par défaut est en effet inefficace pour les fichiers binaires à cause de la codification assez volumineuse qui est utilisée pour les caractères non-alphanumériques. Quand on utilise multipart/form-data, les fichiers sont transmis séparément des champs classiques, avec une représentation plus compacte que ces derniers. Le formulaire des saisie des films utilise cette option pour transmettre efficacemnt le fichier contenant l’affiche du film (voir chapitre 5, section 5.3.2).
Voici une illustration avec le code HTML donnant le début du formulaire de la figure 6. Le service associé à ce formulaire est le programme Films qui se trouve sur le serveur cartier.cnam.fr (port 8080). La méthode POST indique un mode particulier de passage des paramètres.
FORM ACTION=’http://cartier.cnam.fr:8080/cgi-bin/Films’ METHOD=POST
à l’intérieur d’un formulaire, on peut placer plusieurs types de champs de saisie, incluant les valeurs numériques ou alphanumériques simples saisies par l’utilisateur, les choix multiples ou exclusifs parmi un ensemble de valeurs prédéfinies, du texte libre ou la transmission de fichiers.