TUTORIELS 
Récupérer des données de formulaire en Perl: GET ou POST?
Le Dynamic HTML n'est pas un langage en soi, mais la combinaison de code HTML, de feuilles de style et de code Javascript.  (15 mars 2001)
 

Il existe deux manières de transmettre les données d'un formulaire à un programme Perl, deux méthodes (correspondant à la valeur de l'attribut METHOD de la balise <FORM> de la page HTML où se situe le lien vers le CGI) qui font appel à deux variables d'environnement distinctes: QUERY_STRING pour la méthode GET, CONTENT_LENGTH pour la méthode POST.

La méthode GET
Les données sont transmises par l'intermédiaire de l'URL cible. Par exemple, si le formulaire comporte deux champs : l'un nommé nom, l'autre prénom, on pourra avoir :

http://www.monsite.com/cgi-bin/monscriptperl.cgi?&nom=DUPONT&prenom=Jean

Le contenu de la variable Perl $ENV{QUERY_STRING} est alors « &nom=DUPONT&prenom=Jean ».
L'inconvénient vient du fait que les serveurs limitent, généralement à 256 caractères, la longueur des URL. Ainsi, de volumineux formulaires ne pourront être transmis par la méthode GET.

La méthode POST

Les données sont transmises sous forme d'une requête au serveur, et le CGI les interprète comme un flux sur le canal d'entrée standard (STDIN). De cette manière, la taille de ce flux n'est pas limitée, ce qui permet de gérer de « gros formulaires ». En contrepartie, un problème se pose, si, par exemple, vous souhaitez que votre formulaire envoie les données non au CGI directement, mais à une page HTML qui, par l'intermédaire de l'instruction SSI #exec (à supposer que le serveur la supporte), fait appel au CGI (ce genre d'opération permet notamment de simplifier grandement le travail de personnalisation des pages renvoyées par le CGI), alors la méthode POST est inopérante, et seule la méthode GET conviendra.
La variable Perl qui nous intéresse alors est $ENV{CONTENT_LENGTH}, qui contient la longueur du flux d'entrée. On récupérera alors son contenu avec la fonction Perl read() :

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

La variable $buffer contient alors ce qu'aurait contenu $ENV{QUERY_STRING} avec la méthode GET (on peut écrire dans ce cas $buffer=$ENV{QUERY_STRING}).

La récupération des données du formulaire est donc assez différente dans les deux cas. Une fois cette étape effectuée, il reste à « découper » notre variable $buffer. La méthode pour cette dernière opération est décrite par ailleurs (voir notre article sur l'élaboration d'un ). Elle nécessite, en particulier la connaissance des .
Mais d'autres moyens, plus simples, sont à la disposition du développeur, et reposent, l'un sur la bibliothèque de fonctions Perl cgi-lib.pl, l'autre sur le module CGI.pm.

Se simplifier la tâche
Rendre accessible le module CGI.pm par un programme Perl nécessite l'instruction use CGI ; On peut alors récupérer les données d'un formulaire (que la méthode d'envoi ait été GET ou POST), en créant un objet de type CGI :

my $buffer = new CGI ;

Alors les différents noms des champs du formulaire sont contenus dans le tableau :$buffer->param (on écrira par exemple : @noms = $buffer->param; pour récupérer tous les noms)
On récupérera la valeur d'un champ particulier (dont le nom est par exemple « nom ») par : $valeur=$buffer->param(‘nom'); Le module CGI.pm offre par ailleurs des outils très puissants de manipulation de formulaires HTML.
Pour plus d'information sur cette librairie :
http://www.mathematik.uni-ulm.de/help/perl5/modules/CGI.pm.html

Avec la bibliothèque cgi-lib.pl, on dispose de la sous-routine ReadParse, que l'on utilisera ainsi (indépendamment de la méthode d'envoi) :

&ReadParse(*FORM);


placera les données du formulaire dans le tableau associatif %FORM (ou tout autre nom que l'on souhaitera lui donner). On récupérera alors les noms des champs par
@noms = keys(%FORM); et les valeurs par (cas ou le nom du champ est « nom »): $valeur=$FORM{‘nom'};

Précisons, pour finir sur l'envoi à un script CGI/Perl de données d'un formulaire, que la variable $ENV{‘REQUEST_METHOD'} contient le nom de la méthode utilisée pour l'envoi, à savoir GET ou POST, suivant le cas.

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page