Author: Xul.fr - Denis Sureau
Copyright © 2007 W3C® (MIT, ERCIM, Keio),Tous droits réservés. Les règles du W3C pour les responsabilité, nom de marque et usage du document sont applicables.
Cette spécification définit l'objet XMLHttpRequest
,
une bibliothèque qui procure des fonctionnalités de client HTTP
additionnelles pour transférer des données entre un client et
un serveur.
Cette section décrit le statut de ce document au moment de sa publication. D'autres documents peuvent remplacer ce document. Une liste des publications W3C en cours et la dernière révision de ce compte-rendu technique peuvent être trouvés dans l' index des compte-rendus techniques W3C à http://www.w3.org/TR/.
C'est la version du 26 Octobre 2007 du Document de Travail de la spécification
de l'objet XMLHttpRequest
. Envoyez s'il vous plaît vos
commentaires à public-webapi@w3.org
(archives)
avec soit [XHR] ou [XMLHttpRequest] au
début de la ligne du sujet.
Ce document est produit par le groupe de travail API Web (Web APIs Working Group), qui fait partie de l'activité clients web riches (Rich Web Clients Activity) dans le domaine d'interaction (Interaction Domain) W3C. Les modifications faites sur ce document peuvent être trouvée sur le serveur CVS public du W3C.
La publication en tant que Document de Travail n'implique pas l'approbation par les membres du W3C. C'est un document de travail et il peut être mis à jour, remplacé ou rendu obsolète par d'autres documents à tout moment. Il serait inapproprié de citer ce document autrement que comme un travail en cours.
Ce document a été produit par un groupe opérant sous
la politique
de brevet du W3C du 5 février 2004. Le W3C maintient une liste publique
de toutes divulgations de brevet faites en relation avec les productions
du groupe; cette page inclut également les instructions pour divulguer
un brevet. Une personne ayant connaissance d'un brevet dont il croit qu'il
contient des Revendications
Essentielles vis à vis de cette spécification doit divulguer
cette information, comme le demande la section
6 de politique de brevet du W3C.
Cette section est non-normative.
L'objet XMLHttpRequest
est une interface mise à disposition
par un interpréteur de scripts qui permet aux scripts d'accomplir les
fonctionnalités de client HTTP,
telles que soumettre des données de formulaire ou le chargement de
données à partir d'un serveur.
Le nom de l'objet est XMLHttpRequest
pour la compatibilité
avec le web et n'a pas de sens autrement. Il support le transfert de données
aux formats autres qu'XML, quelques implémentations supportent d'autres
protocoles que HTTP (bien que cette fonctionnalité ne soit pas couverte
dans cette spécification) et l' API
supporte également l'envoi de données.
Cette section est non-normative.
L'objet XMLHttpRequest
a été implémenté
depuis plusieurs années en tant que contrôle ActiveX dans le
navigateur Internet Explorer. Malheureusement les implémentations ne
sont pas complètement interopérables.
Basée sur ces implémentations antérieures, la présente
spécification définit comment un sous-ensemble de XMLHttpRequest
devrait fonctionnet et cela probablement conduira des implémentations
de l'objet XMLHttpRequest
à plus interopérables
et plus utiles.
Les versions futures de cette spécification (à ne pas confondre
avec les esquisses futures de cette version) pourront ajouter de nouvelles
fonctionalités, après exemen attentif par les développeurs
de navigateurs et les développeurs de contenu Web.
Que dire d'autre? Des suggestions?
Cette section est non-normative.
Divers exemples seront fournis dans la spécification.
Il faut développer cela ou obtenir quelque texte.Cette section est non-normative.
Les implémentations qui font fonctionner un code provenant de sources non fiables, voudront probablement imposer des contraintes additionnelles sur quelques fonctionnalités définies dans cette spécification. Cela n'est pas obligatoire et une implémentation est libre d'ignorer cette section.
Les restrictions consistent à empêcher des utilisateurs non
fiables de l'API d'utiliser l'implémentation pour obtenir des données
sensibles. Plus particulièrement, une implémentation dans
un navigateur voudra souvent empêcher les pages d'un site web A de
retrouver des données sur un site B. La raison de cela est que le
site B peut se trouver derrière un firewall commun. Si les données
pouvaient être obtenues du site B, alors le site A pourrait utiliser
le navigateur pour parvenir à contourner le firewall.
Une autre faille de sécurité peut exister si le site web B
requiert une authentification, comme par exemple sur une banque en ligne.
S'il était permis au site A d'accéder aux données sur
le site B et que l'utilisateur avait visité la banque récemment
et s'était logué à ce moment là, la page du
site A aurait accès à des informations privées telles
que les ordres passés. Habilement conçue, une page du site
A pourrait même opérer des transactions de transfert d'argent
à partir du compte bancaire des utilisateurs du navigateur.
Pour prévenir ces attaques, l'implémentation devrait permettre
à une page chargée sur le site web A d'accéder seulement
aux autres pages du même site. Deux sites web sont considérés
comme différents s'ils utilisent des noms DNS différents,
même si ces noms sont liés à la même IP. Ceci
parceque les deux sites web pourraient être hébergés
par un service d'hébergement qui place plusieurs sites sur un même
serveur et utilise ensuite le nom d'hôte donné en requête
pour décider du site à servir. Par ailleurs, des numéros
de port TCP différents ou des protocoles différents (comme
http et https) sont considérés comme sites web différents.
L'implémentation doit prendre garde à toujours limiter l'accès
au même site web, et pas seulement pendant la requête HTTP initiale.
Par exemple, si la requête est le résultat d'un redirection,
l'implémentation devrait vérifier que la redirection pointe
sur le même site web et refuse l'accès autrement.
Une autre fonctionnalité que l'implémentation pourrait limiter
est la méthode setRequestHeader
.
Si l'implémentation permet que l'on assigne l'en-tête Host
et que deux sites web sont hébergés sur le même serveur,
un site pourrait avoir accès à des informations sensible sur
l'autre site.
...
Peut-être devrait-on utiliser ce texte en ligne plutôt qu'ici?
Le terme corps de l'entité (entity
body) est utilisé dans cette spécification comme défini
par RFC 2616 ([RFC2616],
section 7.2.1).
Le terme restaure (reset) soit signifie que le membre en question DOIT être remis à sa valeur initiale, soit que chaque membre de l'objet doit l'être, selon la façon dont il est utilisé.
L'URI de base en antémémoire
(URI cached base) DOIT être window.document.baseURI
une
fois que l'objet XMLHttpRequest
est initialisé. Il s'agit
plus précisément de la fenêtre (Window)
d'ou
vient le constructeur XMLHttpRequest
, et non de la fenêtre
qui appelle l'objet. [Window]
Cette section est normative.
Les mots clés DOIT, NE DOIT PAS, REQUIS, VA, NE VA PAS, DEVRAIT, NE DEVRAIT PAS, RECOMMENDÉ, PEUT, et OPTIONNEL dans ce document doivent être interprétés comme décrit en RFC 2119 [RFC2119].
Cette spécification définit les classes de produits suivantes:
Les extensions à l'interface XMLHttpRequest
sont réservées
à un travail futur du Groupe de Travail APIs Web. Le Groupe de Travail
comme le Groupe de Travail APIs Web peut étendre l'interface, mais
DOIT le faire en coordination avec le Groupe de Travail APIs Web. Les AUs
PEUVENT étendre
l'interface, mais DOIVENT préfixer les nouveaux membres en utilisant
une chaîne spécifique au vendeur sur le modèle
"VendorMember". (Normalement les membres suivent
le modèle "member".) La société
Foo peut introduire par exemple une méthode FooFollowRedirect(boolean)
.
Les auteurs PEUVENT utiliser un mécanisme d'extension propre à
leur langage hôte, comme .prototype
en ECMAScript.
La spécification actuelle n'inclut par les fonctionnalités suivantes qui peuvent ou non être implémentées par les AUs.
load
et attribut onload
;error
et attribut onerror
;progress
et attribut onprogress
;ontimeout
;responseXML
pour les documents text/html
;
XMLHttpRequest
. XMLHttpRequest
L'interface XMLHttpRequest
peut être utilisée pour
permettre aux scripts de se connecter mécaniquement à leur serveur
original par HTTP.
Les objets implémentant l'interface XMLHttpRequest
DOIVENT
aussi implémenter l'interface EventTarget
[DOM3EV].
En ECMAScript [ECMA262], une instance de XMLHttpRequest
peut
être créée avec le constructeur XMLHttpRequest()
:
var client = new XMLHttpRequest();
Une description plus complète de ce qui peut être fait avec
XMLHttpRequest
peut être trouvée dans l'IDL
ci-dessous et les explications associées. L'IDL
est non-normative et n'a pas l'intention de se conformer à [OMGIDL].
Seul les transpositions dans des langages sont normatives.
L'interface XMLHttpRequest
interface XMLHttpRequest { attribut EventListener onreadystatechange; readonly attribut unsigned short readyState; void open(en méthode DOMString, en uri DOMString); void open(en méthode DOMString, en uri DOMString, en boolean async); void open(en méthode DOMString, en uri DOMString, en boolean async, en utilisateur DOMString); void open(en méthode DOMString, en uri DOMString, en boolean async, en utilisateur DOMString, mot-de-passe DOMString); void setRequestHeader(en en-tête DOMString, en valeur DOMString) raises(DOMException); void send(en donnée DOMString) raises(DOMException); void send(en donnée Document) raises(DOMException); void abort(); DOMString getAllResponseHeaders(); DOMString getResponseHeader(en en-tête DOMString); attribut DOMString responseText; attribut Document responseXML; attribut unsigned short status; // déclenche(DOMException) de récupération attribut DOMString statusText; // déclenche(DOMException) de récupération };
onreadystatechange
de type
EventListenerUn attribut qui prend un EventListener
comme valeur
et qui DOIT être invoqué quand readyState
est envoyé à l'objet implémentant l'interface
XMLHttpRequest
.Sa valeur initiale DOIT
être null
.
readyState
de type unsigned short,
lecture seuleL'état de l'objet. L'attribut DOIT avoir une des valeurs suivantes:
open()
a été appelée avec succès.responseText
de type DOMStringSi l'attribut readyState
a une valeur autre que 3 (Réception) ou 4 (Chargé),
ce DOIT
être une chaîne vide. Autrement, ce DOIT
être le fragment du corps de l'entité reçue jusque-là
(quand readyState
vaut 3 (Réception)) ou le corps de l'entité (quand readyState
vaut 4 (Chargé)), interprété comme un flux de
caractères.
Si la réponse inclut un type de contenu (Content-Type
)
compris par l'AU, sauf exception que la règle dans le paragraphe
final de la section 3.7.1 de [RFC2616],
et la règle dans la section 4.1.2 of [RFC2046]
DOIT être traitée comme si elles spécifient
lencodage de caractère par défaut étant UTF-8. Les
octets invalides DOIVENT
être convertis en caractère de REMPLACEMENT U+FFFD. Si
l'AU ne peut dériver un flux en accord avec la spécification
du type de média, reponseText
DOIT
être null
.
responseXML
de type DocumentSi l'attribut readyState
a une valeur autre que 4 (Chargé), il DOIT être null
.
Sinon, si l'en-tête Content-Type
contient un type
de média (on ignore les paramètres) c'est soit text/xml
,
application/xml
, soit se terminant par +xml
,
ce DOIT être un objet qui implémente l'interface Document
représentant le document parsé. Si Content-Type
ne contient par un media d'un tel type, ou si le document ne peut
pas être parsé (à cause d'une erreur de syntaxe
XML ou d'un encodage
de caractères non supporté), il DOIT être null
.
status
de type unsigned shortSi l'attribut status
n'est pas disponible, il DOIT produire
une exception. Il DOIT
être disponible quand readyState
vaut 3 (Réception) ou 4 (Chargé). Quand il est disponible,
il DOIT
représenter le code d'état HTTP
(normalement 200 pour une connection réussie).
DOMException |
|
statusText
de type DOMStringSi l'attribut statusText
n'est pas disponible il DOIT
lever une exception. Il DOIT être disponible quand readyState
vaut 3 (Réception) ou 4 (Chargé). Quand il est disponible,
il DOIT représenter le libellé de l'état HTTP
envoyé par le serveur (apparaissant après le code d'état).
DOMException |
|
abort
Quand elle est invoquée, cette méthode DOIT annuler toute activité du réseau dont l'objet est responsable et restaurer l'objet.
getAllResponseHeaders
Si l'attribut readyState
a une valeur autre que 3 (Réception) or 4 (Chargé),
elle DOIT
retourner null
. Sinon, elle DOIT retourner tous les en-têtes
HTTP, dans une seule
chaîne, avec les lignes d'en-tête séparées
par une paire CR (U+000D) LF (U+000A). La ligne d'état ne DOIT
par être incluse.
// Le script suivant: var r = new XMLHttpRequest(); r.open('GET', 'test.txt', false); r.send(); print(r.getAllResponseHeaders()); // ...devrait afficher quelque chose d'équivalent au texte suivant: Date: Dim, 24 Oct 2004 04:58:38 GMT Server: Apache/1.3.31 (Unix) Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/plain; charset=utf-8
|
Une chaîne constituée de tous les en-têtes HTTP headers. Voir le détail dans la description. |
getResponseHeader
Si l'attribut readyState
a une valeur autre que 3 (Réception) ou 4 (Chargé),
elle DOIT
retourner une chaîne vide. Sinon, elle DOIT
représenter la valeur de l'en-tête HTTP
contenu dans les données reçues jusque-là pour
la dernière requête envoyée, dans une simple chaîne.
Si plus d'un en-tête de nom donné a été
reçu, alors les valeurs DOIVENT être concaténées,
séparées les unes des autres par une VIRGULE U+002C
suivie par un ESPACE U+0020. Si aucun en-tête de ce nom n'a
été reçu, alors elle DOIT
retourner une chaîne vide. Les noms d'en-têtes DOIVENT
être comparés sans égard à la casse avec
l'argument de la méthode (en-tête).
// Le script suivant: var r = new XMLHttpRequest(); r.open('GET', 'test.txt', false); r.send(); print(r.getResponseHeader('Content-Type')); // ...devrait afficher quelque chose d'équivalent au texte suivant: Content-Type: text/plain; charset=utf-8
en-tête
de type DOMString
|
Valeur de l'en-tête HTTP donnée. |
open
L'appel de cette méthode DOIT initialiser l'object en rappelant
les arguments method, uri, async
(valeur par défaut true
si omis), user
(valeur par défaut null
si omis), et password
(valeur par défaut null
si omis), en assignant
1 à l'attribut readyState
(Ouvert), en restaurant les attributs responseText
,
responseXML
,
status
, et statusText
à leur valeurs initiales, et en restaurant la liste des en-têtes
de requêtes.
Les restrictions de sécurité de même origine DEVRAIENT s'appliquer.
Si l'URI assigné à cette méthode contient userinfo
([RFC3986], section 3.2.1) alors le nom d'utilisateur et le mot de
passe spécifiés DOIVENT être utilisés si
les arguments user et password arguments sont
omis Si les arguments sont donnés, ils ont la priorité,
même s'ils sont null
. L'utilisation de userinfo
est déconseillée et PEUT ne pas fonctionner dans les
implémentations.
Si open()
est appelée quand readyState
vaut 4 (Chargé) l'objet entier DOIT être restauré.
méthode
de type DOMStringGET
, POST
, PUT
,
DELETE
et HEAD
DOIVENT être
supportées [RFC2616].uri
de type DOMStringasync
de type boolean, optionnelutilisateur
de type DOMString, optionnelmot de passe
de type DOMString, optionnelsend
Si l'attribut readyState
a une valeur autre que 1 (Ouvert), une exception DOIT être levée.
Sinon, l'attribut readyState
DOIT être assigné à 2 (Envoyé) et une requête
à uri par la méthode méthode
envoyée. Si le drapeau async est positionné
sur faux, alors la méthode ne
DOIT PAS s'achever tant que la requête n'est pas satisfaite.
Sinon elle DOIT
s'achever immédiatement. (Voir: open()
.)
Si une donnée est passée par la méthode
send()
elles DOIT
être utilisée dans le corps de l'entité en suivant
ces règles:
DOMString
,
elle DOIT
être encodée comme pour une transmission UTF-8.Document
, elle
DOIT
être sérialisée en utilisant l'encodage donné
par data.xmlEncoding
, si spécifié
et supporté, ou UTF-8 autrement [DOM3].DOMString
ni un Document
les mécanismes de conversion
en chaîne du langage hôte DOIVENT
être utilisés sur l'argument qui a été
passé et le résultat DOIT
être encodé comme pour une transmission UTF-8.Invoquer send
sans l'argument donnée
DOIT
donner le même résultat que si elle était invoquée
avec un argument null
. Les auteurs DEVRAIENT
spécifier l'en-tête Content-Type
par setRequestHeader
avant d'invoquer send
avec un argument.
Si la réponse est une redirection HTTP (code d'état 301, 302, 303 ou 307), alors elle DOIT être suivie de façon transparente (à moins que cela ne viole la sécurité ou les précautions contre l'entrée dans une boucle infinie). Noter que HTTP [RFC2616] impose des obligations aux AUs concernant la préservation de la méthode de requête pendant les redirections, et en outre requiert que les utilisateurs soient notifiés de certaines sortes de redirections automatiques.
Si l'AU permet la spécification d'un proxy, il DEVRAIT
modifier la requête de façon appropriée; i.e.,
connecter au proxy au lieu du serveur originel, modifier Request-Line
et envoyer les en-têtes Proxy-Authorization
comme
spécifié.
Si l'AU supporte l'Authentification HTTP
[RFC2617] il DEVRAIT
considérer les requêtes venant de cet objet comme faisant
partie de l'espace de protection qui inclut les URIs accédés
et envoyer des en-têtes d'Authorization
et prendre
en charge les requêtes non autorisées 401 de façon
appropriée. Si l'authentication échoue, l'AUs devrait
se placer en attente des références des utilisateurs.
Si l'AU supporte la gestion des états HTTP
[RFC2109][RFC2965] il devrait persister, mettre de coté et
envoyer des cookies (tels que reçus dans les en-têtes
de réponse Set-Cookie
et Set-Cookie2
,
et envoyés dans l'en-tête Cookie
) selon
l'applicabilité.
Si l'AU implémente une antémémoire HTTP
[RFC2616] il devrait
respecter les en-têtes de requête Cache-Control
assignées par l'auteur (e.g.,
Cache-Control: no-cache
outrepasse l'antémémoire).
Il ne DOIT
PAS envoyer les en-têtes de requête Cache-Control
ou Pragma
automatiquement à moins que l'utilisateur
ne requiert explicitement un tel comportement (e.g., par un rechargement
forcé de la page). Les réponses 304 Non Modifié
qui sont le résultat des requêtes conditonnelles générées
par l'UA DOIVENT
être présentées comme réponse 200 OK avec
le contenu approprié. De tels AUs DOIVENT
permettre aux auteurs de surcharger la validation automatique d'antémémoire
en assignant des en-têtes de requête (e.g., If-None-Match
,
If-Modified-Since
), auquel cas les réponses 304
Non Modifié DOIVENT
être passées aussi bien.
Si l'AU implémente une négociation du contenu dirigée
par le serveur [RFC2616],
il DEVRAIT
assigner les en-têtes Accept-Language
, Accept-Encoding
et Accept-Charset
de façon appropriée;
il ne DOIT
PAS assigner l'en-tête Accept
automatiquement.
Les réponses à de telles requêtes DOIVENT
avoir le codage du contenu supprimé automatiquement.
Immédiatement avant la réception du corps du message
(s'il y en a un), l'attribut readyState
DOIT valoir 3 (Réception). Quand la requête a terminé
le chargement, l'attribut readyState
DOIT valoir 4 (Chargé). En cas de requête HEAD readyState
DOIT valoir
4 (Chargé) immédiatement après avoir atteint
3 (Réception).
Si l'AU supporte Expect/Continue pour les corps de requête
[RFC2616] il DEVRAIT
insérer les en-têtes Expect
et gérer
les réponses 100 Continuer de façon appropriée.
données
de types variables (voir IDL)
DOMException |
|
setRequestHeader
La valeur du champ d'en-tête (header) de requête nommée DOIT être assignée avec la valeur, avec les exceptions suivantes:
readyState
a une valeur autre que 1 (Ouvert), une exception DOIT
être levée.Accept-Charset
, Accept-Encoding
,
Content-Length
, Expect
, Date
,
Host
, Keep-Alive
, Referer
,
TE
, Trailer
, Transfer-Encoding
ou Upgrade
insensiblement à la casse.// Le script suivant: var client = new XMLHttpRequest(); client.open('GET', 'demo.cgi'); client.setRequestHeader('X-Test', 'one'); client.setRequestHeader('X-Test', 'two'); client.send(null); // ...doit avoir pour résultat que l'en-tête suivant ait été envoyé: ... X-Test: one, two ...
Les implémentations DOIVENT
remplacer toute valeur existante si la valeur du champ d'en-tête
de requête nommée fait partie de: Authorization
,
Content-Base
, Content-Location
, Content-MD5
,
Content-Range
, Content-Type
, Content-Version
,
Delta-Base
, Depth
, Destinaion
,
ETag
, Expect
, From
, If-Modified-Since
,
If-Range
, If-Unmodified-Since
, Max-Forwards
,
MIME-Version
, Overwrite
, Proxy-Authorization
,
SOAPAction
ou Timeout
.
Sinon, si le champ d'en-tête de requête nommé
a une valeur, la nouvelle valeur DOIT
être combinée avec la valeur existante (section 4.2,
[RFC2616]). Voir
aussi la méthode send()
concernant la prise en charge de l'en-tête par l'AU pour la
mise en cache, l'authentification, les proxys, et les cookies.
La liste d'en-têtes de requêtes DOIT être restaurée
quand la méthode open()
est appelée.
en-tête
de type DOMStringvaleur
de type DOMStringDOMException |
|
Les requêtes HTTP
envoyées par de multiples objets XMLHttpRequest
différents
successifs DEVRAIENT
être acheminées dans des connections HTTP
partagées.
Ces sections décrivent les différents évènements
qui peuvent être affectés à l'objet implémentant
l'interface XMLHttpRequest
. Dans cette version de la spécification,
un seul évènement est défini.
readystatechange
readystatechange
DOIT
être généré quand readyState
change de valeur. Il ne
DOIT PAS être une bulle, ne
DOIT PAS être annulable et DOIT
implémenter l'interface Event
[DOM3EV].
L'évènement n'a pas d'espace de nom (Event.namespaceURI
est null
). Cette section est non-normative
Merci particulièrement aussi aux employés de Microsoft qui
les premiers ont implémenté l'interface XMLHttpRequest
,
qui tout d'abord a été largement diffusée par le navigateur
Internet Explorer de Windows.
Merci spécialement aussi au WHATWG pour l'esquisse de la première
version de cette spécification dans leur document Web Applications
1.0.
Merci aussi à tous ceux qui ont aidé à améliorer cette spécification en envoyant des suggestions et des corrections. (S'il vous plaît, continuez à nous embêter avec vos problèmes!)
(Incidemment, si vous avez contribué à cette spécification d'une manière quelconque et que vous n'êtes pas dans la liste de cet appendice envoyez s'il vous plait un e-mail directement à un éditeur).