perlwin32faq7 - Programmation Web |
perlwin32faq7 - Programmation Web (CGI et PerlIS)
Développement Web avec Perl pour Win32
HTTP (HyperText Transfer Protocol) est le protocole que les navigateurs utilisent pour communiquer avec les serveurs web. Les spécifications officielles pour le standard HTTP sont disponibles sur le serveur web du W3 Consortium à :
http://www.w3.org/pub/WWW/Protocols/
Des instructions plus accessibles sont sur la page HTTP de Yahoo à :
http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/HTTP/
CGI (Common Gateway Interface) est un protocole utilisé par les serveurs web pour exécuter des programmes. Les scripts qui supportent le protocole CGI sont quelques fois appelés «scripts CGI»; cela conduit à l'interprétation erronée que CGI est un langage.
Les informations classiques sur CGI sont disponibles sur le serveur NCSA à :
http://hoohoo.ncsa.uiuc.edu/cgi/
Si vous ne l'avez pas encore lu, lisez-le maintenant. Si cela ne vous convient pas, vous pouvez aller sur la page Yahoo sur les CGI à :
http://dir.yahoo.com/Computers_and_Internet/Software/Internet/World_Wide_Web/Servers/Server_Side_Scripting/Common_Gateway_Interface__CGI_/
(C'est une seule URL)
Essayer aussi les URL suivantes pour la programmation CGI en Perl:
http://www.perl.com/CPAN-local/doc/FAQs/cgi/perl-cgi-faq.html
Si cela ne vous convient pas, achetez un des livres «devenez riche rapidement en écrivant des scripts CGI» chez votre libraire habituel.
Une des grandes différences entre les plates-formes UNIX et Win32 est que, sur Win32, il y a une différence entre les fichiers texte ou ASCII et les fichiers binaires. Pour retourner un fichier graphique, vous devez spécifier que le fichier est binaire, et que la sortie standard doit accepter les données binaires. Essayez quelque chose comme :
$MY_FILE_NOM = 'Penelope.jpg'; $CHUNK_SIZE = 4096;
open( MY_FILE, "<$MY_FILE_NOM" ) or die( "Can't open $MY_FILE_NOM: $!\n" );
print "Content-type: image/jpeg\r\n"; print "\r\n";
binmode( MY_FILE ); # Ceci est très important ! binmode( STDOUT );
while ( $cb = read( MY_FILE, $data, $CHUNK_SIZE ) ) { print $data; }
close( MY_FILE );
Les versions précédentes de Perl pour ISAPI ne renvoyaient pas les en-têtes correctement, et cela amenait les scripts Perl pour ISAPI à mal fonctionner. Vous pouviez contourner cela dans les versions précédentes de PerlIS en envoyant les en-têtes en début de script comme ceci :
print <<"END"; HTTP/1.0 200 OK Content-Type: text/html
END
Cela n'est plus nécessaire avec la version courante de Perl pour ISAPI,
puisqu'il envoie les en-têtes corrects. La valeur du registre qui pilote
ceci est EnableCGIHeader
, une valeur REG_WORD qui est positionnée à 1
par défaut. Cette valeur est stockée sous la clé du registre
HKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\PerlIS. Si vous devez arrêter la
génération automatique de l'en-tête, positionner cette valeur à 0.
Perl pour ISAPI positionne une variable d'environnement, PERLXS
,
pour les scripts exécutés sous Perl pour ISAPI.
my $running_under_perlis = $ENV{PERLXS} eq 'PerlIS';
Perl pour WebSite positionne une variable d'environnement, PERLXS
,
pour les scripts exécutés sous Perl pour WebSite.
my $running_under_perlws = $ENV{PERLXS} eq 'PerlWS';
Le module CGI.pm fonctionne avec ActivePerl. Il est inclus dans la
distribution ActivePerl, et vous pouvez l'utiliser dans vos programmes avec
l'instruction use CGI
. Une documentation complète pour le module CGI est
comprise dans le module, et peut être lue avec perldoc CGI
.
Vous pouvez utiliser les redirections pour faire pointer le navigateur
client sur un autre fichier ou script, habituellement de
manière transparente pour l'utilisateur. Le module CGI fournit
la fonction redirect()
à cette fin. Le code ci-dessous
redirige le navigateur client vers http://www.perl.com,
et fonctionne avec CGI ou PerlIS :
use CGI qw(:standard); print redirect('http://www.perl.com');
Les cookies sont des paquets de données qu'un serveur envoie à un client, comme un navigateur, pour conserver des informations même après que le navigateur ait quitté le site. Cela peut être utilisé pour identifier un client dans des interactions ultérieures ou pour stocker les préférences utilisateurs. Les cookies furent d'abord définis par Netscape, et la définition peut être trouvée sur :
http://home.netscape.com/newsref/std/cookie_spec.html
Le module CGI fournit le support pour la gestion des cookies. Voir Quels modules CGI tournent sous ActivePerl ? pour les informations sur le module CGI, y compris l'emplacement de la documentation en ligne.
Il n'est pas possible, en général, d'obtenir l'adresse email de l'utilisateur sans la lui demander. Si vous avez besoin de l'adresse email, utiliser un formulaire pour la demander à l'utilisateur.
Les spécifications HTTP (voir
<Qu'est-ce que HTTP et comment avoir plus d'informations dessus ?>)
définissent un champs de l'en-tête de requête HTTP
From:
, qui contient l'adresse email de l'utilisateur effectuant la
connexion. Votre script peut le récupérer en utilisant
la variable d'environnement HTTP_FROM. Cependant, le champ est
rarement complété et vous ne pouvez pas
réellement compter dessus.
Il existe beaucoup de manières subtiles de déterminer d'où vient la requête -- comme de consulter l'adresse IP utilisée pour la connexion -- mais vous ne pouvez pas en déduire l'adresse email de l'utilisateur.
Généralement, il est considéré comme une violation de l'intimité de l'utilisateur d'obtenir son adresse email sans la lui demander. Peut-être est-ce pour cela que c'est si difficile.
Vous ne pourrez peut-être pas trouver exactement le script que vous cherchez, mais vous trouverez certainement quelque chose d'adapté à vos besoins.
Quatre des pages de scripts les plus connues sont :
Notez que la plupart des archives de scripts sont orientées scripts UNIX, et vous aurez peut-être à les adapter pour les faire fonctionner (voir Comment faire fonctionner un script prévu pour Unix ?).
C'est une des questions les plus fréquentes sur la liste Perl-Win32-Users. De temps en temps, elle est posée comme ceci : «J'ai un programme à écrire. Voici les spécifications. Merci de me poster la solution pour vendredi». Espérons que le lecteur comprend pourquoi ces messages obtiennent en principe une réponse plutôt sèche, quand ils obtiennent une réponse.
La manière compliquée de tester vos programmes CGI depuis la ligne de commande est d'initialiser des variables d'environnement et un canal d'entrée standard comme ferait un serveur web (voir les spécifications CGI pour plus de détails -- voir Qu'est-ce que CGI et comment avoir plus d'informations dessus ?).
La manière simple est d'utiliser CGI.pm
, le module Perl pour la programmation CGI.
Il fournit un mécanisme simple pour exécuter les programmes CGI depuis la ligne de
commande. Voir Quels modules CGI tournent sous ActivePerl ?.
Vous utilisez une vieille version de Perl pour ISAPI comme interpréteur Perl sur un serveur web IIS, et le champ Content-Type: n'est pas renvoyé comme une ligne de statut HTTP. Vous devriez pouvoir régler le problème en installant la dernière version de Perl et PerlIS. Voir Mes scripts CGI ne semblent pas fonctionner avec PerlIS. pour plus de détails.
Votre serveur web est mal configuré. Il ne sait pas qu'il doit exécuter votre programme Perl, donc il le renvoie simplement au navigateur. Voir la page perlwin32faq6 pour des détails sur la manière de configurer votre serveur pour qu'il sache que les scripts Perl doivent être exécutés.
Cette FAQ a été à l'origine assemblée et maintenue par Evangelo Prodromou. Elle a été révisée et mise à jour par Brian Jepson de O'Reilly and Associates, et David Grove et David Dmytryshyn d'ActiveState.
Cette FAQ est dans le domaine public. Si vous l'utilisez, cependant, vérifiez, s'il vous plaît, que vous donniez le crédit aux auteurs originaux.
Cette traduction française correspond à la version anglaise distribuée avec perl 5.8.0. Pour en savoir plus concernant ces traductions, consultez http://www.enstimac.fr/Perl/ .
Fabien Martinet <ho.fmartinet@cma-cgm.com>
Jean-Louis Morel <jl_morel@bribes.org> (mise à jour perl 5.8.0)
perlwin32faq7 - Programmation Web |