Un exemple typique de CGI concerne la recherche d'informations dans une base de données. Il n'est pas toujours possible ni intéressant de mettre toutes les informations sous forme HTML avec les hyper-liens. Ce peut être un travail de titan ou tout simplement impossible en pratique parce que les informations sont dynamiques. Il est souvent nécessaire d'aller puiser les informations directement là où elles se trouvent et de les mettre en forme HTML au moment où l'utilisateur demande leur visualisation.
Un autre exemple classique est l'entrée d'informations via le serveur WEB. Une page peut présenter un formulaire et permettre à l'utilisateur d'encoder des informations. Le CGI sera invoqué pour placer ces informations où elles doivent être stockées.
<form action="/cgi-bin/infocli.exe" method="POST">
En recevant cette requête, le serveur WEB lancera le programme exécutable spécifié et lui passera les informations du formulaire, récupérera la sortie du CGI et la transmettra au client . Un exemplaire du CGI est lancé pour chaque requête client. L'exécution du CGI ne dure que le temps de faire la requête.
On écrit donc le CGI avec n'importe quel langage. La seule exigence est que ce langage puisse employer la méthode de communication utilisée pour échanger les informations avec le serveur WEB et bien entendu qu'il soit adapté au travail à effectuer.
C'est le langage C qui est le plus souvent utilisé. Mais on voit aussi dans le monde Unix de simples shell-scripts ou en langage Perl. Rien n'empêche d'utiliser un langage plus moderne comme Object Pascal et d'employer un environnement de développement visuel comme Delphi.
La norme CGI est simple: le programme reçoit du serveur WEB toutes les données en entrée via l'entrée standard (stdin) et transmet ses sorties via la sortie standard (stdout). Quelques renseignements annexes sont passés par le biais de variable d'environnement.
La norme WINCGI est un détournement de la norme CGI: les mêmes informations sont passées via un fichier INI au lieu des entrées/sorties standard et des variables d'environnement. Cette adaptation était nécessaire par le passé parce Windows 3 n'avait pas d'entrée sortie standard ! Mais à l'heure actuelle, Windows 95 et Windows NT disposent du mécanisme des entrées/sorties standard et Delphi 2 peut facilement les employer. Il n'y a donc aucune raison de passer par un fichier intermédiaire. A mon avis la norme WinCGI est appelée à disparaître au profit de la norme CGI. Il est ainsi possible de porter un programme Unix sans aucune modification du code C, ou de transposer à Object Pascal (Delphi) le code C.
Le document essentiel à se procurer est: "The WWW Common Gateway Interface Version 1.1". On peut le trouver sur divers sites WEB, notamment à http://www.ast.cam.ac.uk/~drtr/cgi-spec.html . Ce document de 16 pages décrit tout ce qu'il faut savoir sur la manière de communiquer entre le serveur WEB et le CGI, en entrée et en sortie. Vous trouverez pas mal d'information et liens vers d'autres sites à http://hoohoo.ncsa.uiuc.edu/docs/cgi.
Pour employer un CGI, il faut bien entendu réaliser une page WEB qui y fait référence. La syntaxe HTML pour réaliser ces pages se trouve décrite dans le document RFC1866 que l'on trouve facilement sur toutes sortes de sites qui reprennent tous les documents décrivant les standards Internet. Le principal étant : ftp://ds.internic.net/rfc.
Un bon point d'entrée pour toutes sortes de documentations à propos d'Internet est : http://www.microsoft.com/workshop/resource/specs.htm
Pour commencer :
Un programme CGI est obligatoirement un programme mode console (Menu- Projet - Options - Lieur - Générer application console; ou en tête de projet {$APPTYPE CONSOLE}) puisqu'il est nécessaire d'avoir accès aux entrées/sorties standards.
Dans les applications Delphi en mode console, on a accès aux entrées/sorties standard en utilisant les fonctions et procédures standard Read, Write, Readln et Writeln; ou en utilisant l'API Win32. A l'usage, il s'avère plus pratique d'utiliser Write ou Writeln pour les sorties et l'API Win32 pour les entrées. Mais c'est essentiellement une question de préférence du programmeur.
Le fait qu'un programme ait une interface graphique est indépendant de sa qualité de programme en mode console. Un CGI n'a pas besoin d'interface utilisateur. Personne n'est là pour voir ce qui se passe à l'écran pendant son exécution ! Cela dit, dans la programmation Delphi, il est parfois, souvent même, plus facile d'employer une interface graphique simplement pour pouvoir utiliser des composants visuels (VCL) qui effectuent un certain travail. On dispose alors une simple fenêtre qui reçoit ces composants. Fenêtre qui peut ne jamais être montrée à l'écran.
Pour entrer dans le vif du sujet, voici le code source d'une unité source Delphi qui implémente un tout petit CGI qui ne prend aucun paramètre en entrée et qui génère en sortie une page HTML avec le message "Hello from Delphi 2.0, CGI World!". Pour rédiger ce code source, il faut créer une nouvelle application et rédiger le code ci-dessous pour l'événement FormShow de l'unique fenêtre du projet.
{$APPTYPE CONSOLE} unit cgi1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); const FirstTime : Boolean = TRUE; begin if not FirstTime then Exit; FirstTime := FALSE; WriteLn('Content-type: text/html'); WriteLn; WriteLn(''); WriteLn(''); WriteLn('Hello from Delphi 2.0, CGI World! '); WriteLn(''); WriteLn(''); WriteLn('Hello from Delphi 2.0, CGI World!
'); WriteLn(''); WriteLn(''); Application.Terminate; end; end.
Il s'agit comme on le voit de l'unité qui correspond à une application ayant une seule fenêtre, laissée vide. On peut faire mieux en oubliant cette fenêtre et en générant une application console pure. C'est un rien plus difficile dans la mesure où Delphi n'offre pas de possibilité directe de générer un tel projet. Il n'empêche qu'il est facile de le faire. Voici la marche à suivre:
Menu - Fichier - Nouvelle application
Menu - Voir - Source du projet
Ajouter en première ligne {$APPTYPE CONSOLE}
Remplacer "uses Forms" par "uses Windows"
Enlever la ligne "{$R *.RES}
"
Menu - Projet - Supprimer du projet - Unit1 (ne pas sauver unit1)
Menu - Fichier - Enregistrer sous - cgisimple.dpr
Supprimer "Application.Initialize; Application.Run;" entre le "begin" et le "end."
Ajouter le code pour obtenir le listing comme ci-dessous:
{$APPTYPE CONSOLE} program cgisimple; uses Windows; begin WriteLn('Content-type: text/html'); WriteLn; WriteLn(''); WriteLn(''); WriteLn('Hello from Delphi 2.0, CGI World! '); WriteLn(''); WriteLn(''); WriteLn('Hello from Delphi 2.0, CGI World!
'); WriteLn(''); WriteLn(''); end.
Pour tester ce CGI, il faut créer une page WEB qui invoque le CGI. Par exemple:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"&qt <html&qt <head&qt