Comment Ca Marche l'informatique ?
Accueil
Forum
Aide
bordure
Page d'accueil
Ajouter aux favoris
Signalez une erreur
Ecrire à Jean-Francois Pillou
Introduction
Implantation du code
Les objets ASP
Présentation des objets
L'objet Response
L'objet Request
Version 2.0.3
ASP - L'objet Request Page précédente Retour à la page d'accueil

Présentation de l'objet Request

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, ...).

Les constituants de l'objet Request

L'objet Request possède plusieurs collections, une propriété et une méthode :

Collections Propriétés Méthodes
ClientCertificate TotalBytes BinaryRead
Cookies    
Form    
QueryString    
ServerVariables    

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.

La réception de données

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.
  • la méthode GET permet d'envoyer les éléments du formulaire au travers de l'URL du script, en ajoutant l'ensemble des paires nom/valeur à l'URL du script, séparé de celui-ci par un point d'interrogation, ce qui donne un URL du type:
    http://nom_du_serveur/cgi-bin/script.cgi?champ1=valeur1&champ2=valeur2...

    Toutefois, la longueur de la chaîne URL étant limitée à 255 caractères, les informations situées au-delà de cette limite seront irrémédiablement perdues. De plus, cela crée une URL surchargée dans la barre d'adresse d'un navigateur et peut dévoiler des informations sensibles comme un mot de passe...
  • la méthode POST est une bonne alternative à la méthode GET. Cette méthode code les informations de la même façon que la méthode GET (encodage URL et paires nom/valeur) mais elle envoie les données à la suite des en-têtes HTTP, dans un champ appelé corps de la requête. De cette façon la quantité de données envoyées n'est pus limitée, et est connue du serveur grâce à l'en-tête permettant de connaître la taille du corps de la requête.

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

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>

La collection Form

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

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

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

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 méthode BinaryRead()

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

%>


Page précédente

Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL. Vous pouvez copier, modifier des copies de cette page tant que cette note apparaît clairement.