À partir de ce cours, nous entrerons dans le processus d'apprentissage de la programmation CGI. Grâce aux cours précédents, vous maîtrisez les connaissances de base de la programmation CGI. Vous pouvez maintenant vous asseoir et écrire votre programme CGI !
3. Programmation CGI
1. Attachement côté serveur (SSI) et passerelle
2. Passerelle : connectez d'autres protocoles via WEB
Lors du processus d'écriture de programmes CGI, il est préférable de suivre les points de conception d'application suivants :
(1) Posez une question : le problème que vous souhaitez résoudre
(2) Étape de conception : concevoir le cadre et les fonctions de base du programme CGI
(3) Étape de codage - concrétiser des idées avec des actions
(4) Transplantation de programme - écrire du code portable
(5) Viser l'excellence - amener le programme à un niveau supérieur
1. Attachement côté serveur (SSI) et passerelle
Dans cette section, nous présenterons la connexion côté serveur SSI (Server Side Include) et la passerelle. À proprement parler, SSI ne fait pas partie de la programmation CGI, mais SSI peut accomplir certaines tâches que de simples programmes CGI peuvent accomplir, et parfois SSI constitue même le meilleur choix. C’est pourquoi une brève introduction est donnée ici.
SSI définit un ensemble de commandes intégrées dans le texte HTML. Avant que le texte HTML ne soit envoyé au client HTTP, le serveur WEB prétraite ces commandes SSI et envoie le texte HTML traité au navigateur du client HTTP.
Le format de commande de SSI est :
< !--# paramètre de commande="valeur" -->
Les commandes SSI sont différentes de Java ou JavaScript dans la mesure où elles sont traitées côté serveur plutôt que côté client. Ceci est similaire aux programmes CGI. Bien entendu, dans le cadre fonctionnel de SSI, ses avantages sont les mêmes que ceux des programmes CGI. Il peut améliorer l'utilisation des ressources du serveur, et n'importe quel navigateur WEB sur le client peut parcourir le texte HTML contenant SSI.
Voici six commandes SSI couramment utilisées :
(1) Inclure la commande
(2) commande d'écho
(3) commande d'exécution
(4) commande de configuration
(5) commande fsize
(6) commande flashmod
inclure la commande
Le seul paramètre pris en charge est file, qui insère le contenu du fichier spécifié par le paramètre file dans le texte HTML actuel. Si vous connaissez le langage C, vous pouvez voir qu'elle a la même fonction que la commande "#include" en langage C. Par exemple, il existe deux textes HTML : main.html et header.html. Utilisez la commande include dans main.html : main.html :
<html>
< tilte> Test d'inclusion de la commande SSI </ /title>
< !--#include file="header.html" -->
<corps>
L'en-tête ci-dessus provient de header.html !
< /corps>
< /html>
en-tête.html :
< H1> Ceci est un titre dans header.html < /H1>
(Cependant, il semble qu'OmniHTTPD ne prenne pas en charge la commande include :< !)
commande d'écho
Le seul paramètre pris en charge est var, qui est utilisé pour afficher les variables fournies par le serveur, par exemple :
DOCUMENT_NAME : nom du fichier actuel
DOCUMENT_URL : chemin relatif vers le texte SSI
DATE_LOCAL : date locale
DATE_GMT : date GMT (heure normale de Creenwich)
LAST_MODIFIED : La date de dernière modification du fichier contenant cette commande SSI
HTTP_USER_AGENT : nom du navigateur.
Par exemple : main.shtml <html>
Ce document a été mis à jour pour la dernière fois le < !--#echo var="LAST_MODIFIED"-->
< /html>
Lorsque vous ouvrez main.shtml avec un navigateur, vous pouvez voir l'heure de la dernière modification. (Il convient de noter que main.shtml doit être stocké dans le répertoire HtDocs d'OmniHTTPD et accessible dans le navigateur en utilisant l'adresse http://localhost/main.shtml.)
commande d'exécution
Les deux paramètres sont cgi et cmd. Le premier appelle un fichier exécutable, tel que cgi="/cgi-bin/finger.cgi" ; le second appelle une commande système, telle que cmd="ls". Malheureusement, OmniHTTPD ne prend pas en charge cette commande SSI (peut-être que la dernière version le fait maintenant).
commande de configuration
Cette commande définit la façon dont le serveur gère les fichiers et affiche les dates. Il possède deux paramètres :
(1) timefmt, détermine le format d'affichage des dates. Utilisez man strftime sous UNIX pour interroger les valeurs disponibles.
(2) sizefmt, détermine le format d'affichage de la longueur du fichier. La valeur est en octets ou en adresse. Cette commande n'est pas non plus prise en charge dans OmniHTTPD.
commande fsize
Cette commande affiche la taille d'un fichier donné. Le paramètre est file, spécifiant le chemin et le nom du fichier.
commande flashmod
Cette commande affiche la date de dernière modification du fichier spécifié. Le paramètre est file, spécifiant le chemin et le nom du fichier.
2. Passerelle : connectez d'autres protocoles via WEB
Le protocole HTTP ne peut pas accéder à toutes les ressources sur Internet Lorsque vous souhaitez accéder à des ressources autres que le protocole HTTP (telles que POP3 et SMTP pour envoyer et recevoir des e-mails), vous avez besoin d'une passerelle. Un programme CGI est un bon moyen d'implémenter une passerelle.
Certaines passerelles couramment utilisées sont fournies dans de nombreux serveurs HTTP UNIX, tels que finger, wais, archie, etc. Mais dans OmniHTTPD, ces passerelles ne sont pas fournies. Mais nous pouvons ajouter une fonctionnalité de passerelle à OmniHTTPD en écrivant des programmes CGI.
Formulaires et leur traitement
Les formulaires HTML font partie des documents WEB et sont utilisés pour soumettre les informations renseignées par les utilisateurs au serveur. Habituellement, ces informations sont transmises au programme CGI, qui effectue une série d'opérations ou de traitements de données sur la base des informations saisies, puis génère un document HTML représentant les résultats du traitement et le renvoie au navigateur du client.
On peut voir que l'élément clé d'un programme CGI est d'obtenir des données d'entrée et de générer des documents HTML, tandis que les parties d'exploitation et de traitement des données sont les mêmes que celles de la plupart des applications. Dans cette conférence, je présenterai comment obtenir des données et générer des documents HTML en Perl et Delphi.
Tout d’abord, nous créons un document HTML nommé Greeting.html :
Fichier Greeting.html (stocké dans le répertoire HtDocs d'OmniHTTPD)
<html>
<tête>
<title>Ceci est une page de vœux </title>
< h1> Salutation </ /h1>
<corps>
<hr>
<form action="/cgi-bin/greeting.pl" method=POST>
< p> Votre prénom : < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> Votre nom de famille : < input type=text name="lastname" size=60 maxlength=80> < /p>
<hr>
< p> < input type=submit value="Tout est OK !"> < input type=reset value="Effacer tout"> </ /p>
< /form>
< /corps>
< /html>
Voici le programme Perl CGI Greeting.pl :
Fichier Greeting.pl (stocké dans le répertoire cgi-bin d'OmniHTTPD) # Greeting You!
nécessite "cgi-lib.pl" ;
# ===================================
# obtenir les valeurs d'entrée
&ReadParse(*entrée);
$mPremierNom = $input{'prénom'} ;
$mLastName = $input{'nom'} ;
# ===================================
# faites quelques opérations ici
$mFullName = "$mFirstName $mLastName";
# ===================================
# créer un document HTML à afficher
Imprimer et en-tête d'impression ;
print "< html>< head>< title> Je vous salue ! </ /title>< /head> " ;
print "<body> Bonjour, < i>$mFullName< /i> ! ";
print "< hr> par Greeting.pl < /body>< /html>" ;
# ===================================
# Tout est fait !
Testez le programme CGI en parcourant http://localhost/greeting.html.
Dans le programme Perl ci-dessus, en tant que programme CGI, vous devez utiliser require "cgi-lib.pl" pour référencer le fichier cgi-lib.pl. Ce fichier possède de nombreuses fonctions et procédures pour la programmation CGI. require est équivalent à #include en C, mais il convient de noter qu'il doit y avoir un point-virgule après l'instruction require.
Le processus ReadParse lit les données soumises par le formulaire HTML et le paramètre est un pointeur de tableau. Il est à noter qu'en Perl, les appels de fonctions et de procédures doivent être précédés d'un symbole &.
mFirstName, mlastName et mFullName sont des variables. En Perl, les noms de variables doivent être précédés du signe $.
La valeur de retour réelle de la fonction PrintHeader est « Content-type : text/html », qui indique au navigateur que les données suivantes sont un document HTML.
La génération du document HTML est très simple, utilisez simplement l'instruction print pour afficher le contenu du document HTML. Qu’en est-il ? Pouvez-vous utiliser Perl pour écrire des programmes CGI ?
Ensuite, écrivons un programme Delphi pour accomplir la même fonction :
Fermez d'abord tous les projets dans Delphi, sélectionnez le menu Fichier/Nouveau, sélectionnez le type d'application Serveur Web dans la boîte de dialogue et utilisez l'option exécutable CGI autonome. Un nouveau projet apparaîtra avec le nom de la fenêtre principale WebModule1.
Double-cliquez avec la souris sur la propriété Actions de WebModule1 et la fenêtre d'édition de la propriété Actions apparaîtra. Créez une nouvelle action dans la fenêtre, nommée WebActionItem1, définissez sa propriété Default sur True ; et double-cliquez sur l'événement OnAction dans ses événements, ajoutez le code suivant :
procédure TWebModule1.WebModule1WebActionItem1Action(Expéditeur : TObject;Requête : TWebRequest ; Réponse : TWebResponse ; var Gérée : Booléen) ;
var
mPremier, mLastName, mFullName : chaîne ;
HtmlDoc : chaîne ;
commencer
// Récupère les valeurs d'entrée :
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Faites quelques opérations ici
mFullName := mFirstName + ' ' + mLastName;
// Crée un document HTML à afficher
HtmlDoc := '< html>< head>< title> Je vous souhaite la bienvenue </ /title>< /head>';
HtmlDoc := HtmlDoc + '<body> Bonjour, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> par Greeting.cgi < /body>< /html>';
Réponse.Content := HtmlDoc;
fin;
Enregistrez l'unité de ce projet sous cgimain.pas et le projet sous Greeting.dpr. Après la compilation (en utilisant Ctrl+F9), copiez Greeting.exe dans le répertoire cgi-bin d'OmniHTTPD et renommez-le en Greeting.cgi. En même temps, apportez les modifications suivantes au fichier Greeting.html que nous avons écrit précédemment :
Remplacez < form action="/cgi-bin/greeting.pl" method=POST> par
< form action="/cgi-bin/greeting.cgi" méthode=POST>
De cette façon, vous pouvez tester les programmes CGI écrits en Delphi en parcourant http://localhost/greeting.html.
Comme le montre ce programme, dans Delphi, l'événement OnAction de WebActionItem se produit dès que le programme CGI reçoit une requête. Dans ce cas, la saisie des données et la génération du document HTML s'effectuent comme suit :
Obtenez la valeur de l'élément de formulaire via Request.ContentFields.Values [Nom de l'élément de formulaire HTML].
Générez des documents HTML en attribuant une valeur à Response.Content.
Voici le contenu des trois fichiers du programme Delphi : ------------------------------------ ---- -------------------
salutation.dpr :
message d'accueil du programme ;
{$APPTYPECONSOLE}
utilise
HTTPApp,
CGIApp,
cgimain dans 'cgimain.pas' {WebModule1 : TWebModule} ;
{$E cgi}
{$R *.RES}
commencer
Application.Initialiser ;
Application.CreateForm(TWebModule1, WebModule1);
Application.Exécuter ;
fin.
-------------------------------------------------- ----------
cgimain.pas :
unité cgimain;
interface
utilise Windows, Messages, SysUtils, Classes, HTTPApp ;
taper
TWebModule1 = classe (TWebModule)
procédure WebModule1WebActionItem1Action(Expéditeur : TObject;Requête : TWebRequest ; Réponse : TWebResponse ; var Gérée : Booléen) ;
privé
{Déclarations privées}
publique
{Déclarations publiques}
fin;
var
WebModule1 : TWebModule1 ;
mise en œuvre
{$R *.DFM}
procédure TWebModule1.WebModule1WebActionItem1Action (Expéditeur : TObject ; Requête : TWebRequest ; Réponse : TWebResponse ; var Gérée : Booléen) ;
var
mPremier, mLastName, mFullName : chaîne ;
HtmlDoc : chaîne ;
commencer
// Récupère les valeurs d'entrée :
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Faites quelques opérations ici
mFullName := mPremier + ' ' + mLastName;
// Crée un document HTML à afficher
HtmlDoc := '< html>< head>< title> Je vous souhaite la bienvenue </ /title>< /head>';
HtmlDoc := HtmlDoc + '<body> Bonjour, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> par Greeting.cgi < /body>< /html>';
Réponse.Content := HtmlDoc;
fin;
fin.
-------------------------------------------------- ----------
cgimain.dfm :
objet WebModule1 : TWebModule1
OldCreateOrder = Faux
Actions = <
article
Par défaut = Vrai
Nom = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
fin>
Gauche = 192
Haut = 107
Hauteur = 150
Largeur = 215
fin