Le rôle de l'objet Request est de permettre de récupérer la requête HTTP
envoyée par le client au serveur, c'est-à-dire qu'il permet en réalité de manipuler l'ensemble des informations
envoyées par le navigateur du visiteur (page demandé, nom et version du navigateur, cookies stockés sur le disque du client,
adresse IP du client, ...).
L'objet Request possède plusieurs collections, une propriété
et une méthode :
La majorité des propriétés et des méthodes de l'objet
Request correspondent à des fonctions ou propriétés permettant
de manipuler les champs de la requete HTTP.
Pour comprendre comment utiliser l'objet Request, il est nécessaire de connaître
la manière de laquelle les données sont envoyées au navigateur grâce à
la requête HTTP. Pour cela réferrez-vous
à la section "formulaire HTML".
L'envoi de données à un script CGi se fait par l'intermédiaire
d'un formulaire HTML.
Les formulaires HTML se créent à l'aide de la balise <FORM>
contenant des boutons, des champs, des listes et/ou des cases à cocher repérés
par des noms auxquels seront associés des valeurs, fonction de la saisie des utilisateurs,
puis d'un bouton de soumission du formulaire qui enverra l'ensemble des informations au script
indiqué en tant qu'attribut Action de la balise FORM selon la méthode
GET ou POST. Chaque élément du formulaire doit possèder un nom unique, de
telle façon que la valeur associée à l'élément forme avec le nom
de celui-ci une paire nom/valeur du type:
Nom_de_l_element=valeur
L'ensemble des paires nom/valeur sont séparées par des esperluettes (le caractère
"&"). Ainsi, l'envoi d'un formulaire crée une chaîne de la forme:
champ1=valeur1&champ2=valeur2&champ3=valeur3
L'envoi de cette chaîne se fera différemment selon que la méthode utilisée
pour l'envoi du formulaire est GET ou POST.
|
Il est possible de lire les informations transmises à la page cible avec une seule et unique méthode et ce quelque soit la méthode d'envoi (GET ou POST).
Par exemple :
dim sParam1 : sParam1 = Request("Pramar1")
dim sParam2 : sParam2 = Request("Pramar2")
Cela est trés pratique lorsqu'une même page peut-être appelée par un formulaire en GET et un autre en POST.
|
La collection QueryString permet de récupérer la chaîne de
requête envoyée par le client, c'est-à-dire les paires clés/valeurs
présentes dans l'URL après le point d'interrogation. Prenons par exemple l'URL suivante
http://www.commentcamarche.net/asp/caddie.asp?param=12&nom=Jeff
La chaîne de requête est ainsi la suivante :
param=12&nom=Jeff
param et nom sont ici des champs (parfois appelés clés) et leurs valeurs
resectives sont 12 et Jeff.
Voici la syntaxe de la collection QueryString
<%@ LANGUAGE="VBSCRIPT" %>
<% Request.QueryString("Champ")[(Index)|.Count] %>
- Le paramètre champ désigne la variable que l'on désire récupérer. Il
s'agit d'un paramètre obligatoire
- Le paramètre optionnel index permet de définir de façon plus précise le champ
auquel on fait référence, lorsqu'il existe plusieurs champs de même nom
- Le paramètre optionnel .count permet de connaître le nombre de variable possèdant le nom champ
Ainsi, la récupération de la variable nom dans l'exemple ci-dessus se fera
grâce à l'instruction suivante :
<% Request.QueryString("nom") %>
Dans le cas où le formulaire possède plusieurs éléments de même
nom (c'est le cas des cases à cocher et des menus à multiples sélections), il est possible de parcourir les éléments
grâce aux paramètres index et count de la collection QueryString.
Soit le formulaire suivant :
<FORM action="mes_loisirs.asp" method="get">
<BR><INPUT type="checkbox" name="choix" value="musique"> musique
<BR><INPUT type="checkbox" name="choix" value="cinéma"> cinéma
<BR><INPUT type="checkbox" name="choix" value="sport"> sport
<BR><INPUT type="checkbox" name="choix" value="théatre"> théatre
<BR><INPUT type="submit" value="Valider la sélection">
</FORM>
Il est possible d'afficher le nombre de choix sélectionnés, ainsi que de
les lister de la façon suivante dans le fichier mes_loisirs.asp (valeur de l'attribut action du formulaire ci-dessus.
le fichier mes_loisirs.asp pouvant être le même fichier que celui contenant le formulaire).
<%
Response.Write "J'ai sélectionné "
& Request.QueryString("choix").Count
& " loisirs : <BR>"
for i = 1 to Request.QueryString("choix").Count
Response.Write "<BR>"
& Request.QueryString("choix")(i)
next
%>
Il est possible d'afficher tous les champs d'un formulaire en utilisant la
clause For Each du VBScript, qui permet de parcourir l'ensemble des enregistrements
d'une collection. Voici un script qui affiche l'ensemble des valeurs associées aux champs
d'un formulaire après envoi au serveur:
<%@ LANGUAGE="VBSCRIPT" %>
<%
For Each Champ in Request.QueryString
Response.write(Champ & " = " & Request.QueryString(Champ))
Next
%>
<BR>
Enfin pour afficher tous les champs, et les valeurs prises par chaque champ, voici un exemple de code :
<%@ LANGUAGE="VBSCRIPT" %>
<%
For Each Champ in Request.QueryString
Response.write("<P>" & Champ & " : " & Request.QueryString(Champ))
For i = 1 to Request.QueryString(Champ).Count
Response.Write("<BR>Valeur numéro "
& Request.QueryString("choix").Count
& ": " & Request.QueryString(Champ)(i))
Next
Next
%>
<BR>
Alors que la collection QueryString permet de récupérer de façon
simple les données envoyées au script ASP par l'intermédiaire de l'URL
(ou plus exactement par la méthode GET du protocole HTTP), la collection Form permet de manipuler
les données envoyées par un formulaire en utilisant la méthode POST.
La collection Form permet de récupérer la valeur associée
à un champ par la syntaxe suivante
<%@ LANGUAGE="VBSCRIPT" %>
<% Request.Form("Champ") %>
Ainsi pour afficher tous les champs d'un formulaire, il est possible, comme pour la
collection QueryString, d'utiliser la
clause For Each du VBScript, permettant de parcourir les enregistrements
d'une collection. Voici un script qui affiche l'ensemble des valeurs associées aux champs
d'un formulaire après envoi au serveur:
<%@ LANGUAGE="VBSCRIPT" %>
<% For Each Champ in Request.Form %>
<%
Response.write(Champ + " = ")
Response.write(Request.Form(Champ)) %>
<%BR%>
<% Next %>
La collection Cookies permet de récupérer les valeurs d'un cookie,
c'est-à-dire un fichier présent sur le disque du client contenant des données envoyées par le serveur,
(un cookie peut être créé grâce à l'objet Response).
L'accès aux données d'un cookie se fait de la manière suivante:
<%@ LANGUAGE="VBSCRIPT" %>
<% Variable = Request.Cookies("NomCookie")("Element") %>
Il est possible de parcourir l'ensemble des Cookies par le script suivant:
<%@ LANGUAGE="VBSCRIPT" %>
<% For Each Element in Request.Cookies %>
<%
Response.write(Element + " = ")
Response.write(Request.Cookies(Element)) %>
<BR>
<% Next %>
La collection ServerVariables de l'objet Request contient les en-têtes
HTTP de la requête, pouvant parfois donner des informations très utiles sur les
visiteurs où le navigateur du client...
La syntaxe pour récupérer ces en-têtes est la suivante:
Request.ServerVariables("NOM-EN-TETE")
Voici les principaux en-têtes pouvant être utiles:
Nom de l'en-tête |
Description |
ALL_HTTP |
Tous les en-têtes HTTP envoyés par le client |
ALL_RAW |
Tous les en-têtes HTTP envoyés par le client sans formattage (de façon brute) |
APPL_MD_PATH |
Chemin précisé dans la balise <Base> |
APPL_PHYSICAL_PATH |
Chemin physique (sur le serveur) associé à celui précisé dans la balise <Base> |
AUTH_PASSWORD |
Mot de passe saisi lors d'une authentification HTTP |
AUTH_TYPE |
Type d'authentification retenue par le serveur (basic ou digest) |
AUTH_USER |
Nom d'utilisateur saisi lors d'une authentification HTTP |
CONTENT_LENGTH |
Longueur (en octets) du corps de la requête. |
CONTENT_TYPE |
Type de contenu du corps de la requête (par exemple text/html). Voir types MIME |
HTTP_ACCEPT |
Valeur de la directive Accept du protocole HTTP |
HTTP_ACCEPT_ENCODING |
Valeur de la directive Accept-Enconding du protocole HTTP |
HTTP_ACCEPT_LANGUAGE |
Langage attendu par le browser (anglais par défaut). |
HTTP_COOKIE |
Chaîne correspondant aux éventuels cookies du client. |
HTTP_HOST |
Information sur le nom de machine du client. |
HTTP_REFERER |
URL de la page ayant mené à la présente page via un lien
hypertexte. |
HTTP_USER_AGENT |
Chaîne donnant des informations sur le client, comme le nom et la version du navigateur, et éventuellement le système d'exploitation. |
HTTPS |
Indique si le client est en connexion sécurisée ou non (la valeur est ON ou OFF. |
REFERER |
URL du lien à partir duquel la requête a été effectuée |
REMOTE_ADDR |
Adresse IP du client |
REMOTE_HOST |
Nom de la machine du client |
REQUEST_METHOD |
Type de méthode utilisée par le client (ie POST ou GET) |
SCRIPT_NAME |
Chemin relatif du script en cours d'exécution (par rapport à la racine du serveur web) |
SERVER_PROTOCOL |
Version du protocole HTTP utilisé par le serveur |
SERVER_SOFTWARE |
Nom et version du serveur HTTP |
URL |
URL présente dans la requête |
Pour compter les visiteurs d'un site en ne retenant que les nouveaux, il peut être intéressant de stocker l'adresse IP de ces derniers si celle-ci ne figure pas dans la liste déjà enregistrée.
Voici le code permettant de stocker dans une variable l'adresse IP
d'un visiteur, et qui l'affiche:
<%@ LANGUAGE="VBSCRIPT" %>
<%
IP = Request.ServerVariables("REMOTE_ADDR")
Response.write("Votre adresse IP est : " + IP) %>
<BR>
La collection ClientCertificate contient l'ensemble des enregistrements contenus dans
le certificat d'authentification envoyé par le client au serveur dans la requête
HTTP lors d'une connexion via SSL, c'est-à-dire lors d'une requête
dont l'URL commence par https:// au lieu de http://. Afin de pouvoir utiliser correctement
cette collection, le navigateur du client doit être capable d'envoyer des certificats
et le serveur doit supporter SSL. Dans le cas contraire, la collection ClientCertificate renvoie
la valeur EMPTY.
La syntaxe de cette collection est la suivante :
Request.ClientCertificate(Cle[Suffixe])
- L'attribut clé obligatoire correspond au champ du certificat que l'on désire récupérer.
La liste des clés possibles est explicitée ci-dessous
- L'attribut optionnel Suffixe, lorsqu'il est accolé à la clé Subject ou Issuer
(les deux seules clés pour lesquelles il est possible d'utiliser un suffixe) permet de préciser
la partie du champ que l'on désire récupérer
Voici l'ensemble des champs du certificat qu'il est possible de récupérer
grâce à la collection ClientCertificate :
Clé |
Description |
Certificate |
Il s'agit d'une chaîne contenant l'intégralité du contenu du certificat en
format binaire. |
Flags |
Il s'agit d'un drapeau permettant de savoir si un certificat est présent dans la requête du client
(il est alors égal à 1 ou plus exactement à ceCertPresent). Il permet également de
dire si l'utilisateur qui envoie le certificat est connu. Dans le cas contraire il envoie la valeur 2 (ceUnrecognizedIssuer). |
Issuer |
Il s'agit d'un champ contenant des informations concernant l'émetteur du certificat. Utilisé sans suffixe, le
champ retourné est un ensemble de valeurs séparées par des virgules. Le fait de spécifier un suffixe
permet de faire référence à une donnée particulière (la liste des suffixes est précisée
dans le tableau suivant) |
SerialNumber |
Il s'agit du numéro de série du certificat, une chaîne ASCII
composé de nombre hexadécimaux séparés par des tirets |
Subject |
Ce champ contient des informations concernant le sujet même du certificat.
Utilisé sans suffixe, comme pour le champ Issuer, le
champ retourné est un ensemble de valeurs séparées par des virgules. Le fait de spécifier un suffixe
permet de faire référence à une donnée particulière (la liste des suffixes est précisée
dans le tableau suivant) |
ValidFrom |
Le champ ValidFrom précise la date à partir de laquelle le certificat devient valide.
Le format de ce champ dépend du paramétrage du serveur dans la mesure où il suit le
format VBScript. |
ValidUntil |
Le champ ValidUntil précise la date d'expiration du certificat.
Le format de ce champ est identique à celui du champ ValidFrom. |
Voici l'ensemble des suffixes pouvant éventuellement être
utilisés avec les champs Issuer et Subject du certificat (par exemple
IssuerC donnera le pays de l'émetteur du certificat) :
Suffixe |
Description |
C |
Pays d'origine. |
CN |
Nom usuel de l'utilisateur. |
GN |
Nom donné de l'utilisateur. |
I |
Initiales de l'utilisateur.. |
L |
Localité de l'utilisateur. |
O |
Compagnie ou organisation. |
OU |
Unité organisationnelle. |
S |
Etat ou province. |
T |
Titre de l'utilisateur. |
Il est ainsi possible d'afficher le nom de l'utilisateur qui a émis le certificat de la façon suivante :
<%= Request.ClientCertificate("IssuerCN") %>
Le script suivant affiche l'intégralité des champs
contenus dans le certificat :
<%
Const ceCertPresent = 1
Const ceUnrecognizedIssuer = 2
If Request.ClientCertificate("Flags") = ceCertPresent Then
For Each cle in Request.ClientCertificate
Response.Write cle & " = " & Request.ClientCertificate(cle) & "<br>"
Next
Else
Response.Write "Le client n'a pas de certificat ou est inconnu"
End If
%>
La collection Post permet de manipuler la plupart des informations contenues dans
la requête du client. Toutefois certaines informations, comme par exemple les données
binaires envoyées par le client lors de l'envoi d'un fichier (en anglais upload), ne peuvent être traitées
par la seule collection Form.
Ainsi, la méthode BinaryRead() de l'object Request permet de
récupérer les données brutes envoyées dans une requête POST. A l'inverse,
la méthode BinaryWrite() de l'objet Response permet de créer le corps de la réponse HTTP.
La syntaxe de la méthode BinaryRead() est la suivante :
Request.BinaryRead(n)
- Le paramètre obligatoire n indique le nombre d'octets à
lire dans le corps de la requête POST.
Il est possible de connaître la taille totale en octets du corps de la requête POST grâce à la propriété
TotalBytes de l'objet Request. Il est donc essentiel de s'assurer que le nombre d'octets n à lire
est inférieur ou égal à la valeur de TotalBytes
- La méthode BinaryRead retourne les n premiers octets de la requête POST.
L'exemple suivant illustre la façon basique de récupérer le corps
de la requête POST :
<%
Dim DonneesPost, Compteur
Compteur = Request.TotalBytes
DonneesPost = Request.BinaryRead(Compteur)
if DonneesPost != 0
Response.BinaryWrite(DonneesPost)
end if
%>
|