web-dev-qa-db-fra.com

URL relatives dans AJAX demandes

Pourquoi Javascript traite-t-il les URL relatives différemment du HTML standard? Pensez à l'URL suivante (ou parcourez-la simplement): http://en.wikipedia.org/wiki/Rome . Ouvrez une console Firebug (ou une autre console Javascript) et entrez les informations suivantes :

var x = new XMLHttpRequest();
x.open("GET", "foo", true);
x.send("bar");

Sous mon système, la demande est envoyée à " http://en.wikipedia.org/wiki/foo ". Le "Rome" dans l'URL est simplement ignoré. La même demande avec une barre oblique de fin dans l'URL (" http://en.wikipedia.org/wiki/Rome/ ") ajoute le "foo" à l'URL complète.

Cela semble rendre assez difficile l'encodage des URL correctes en Javascript. Existe-t-il des bibliothèques Javascript qui permettent de résoudre ce problème?

(J'ai déjà posé une question similaire question } _, mais plus spécifique à jQuery, où cela se produit également. J'espère obtenir une meilleure réponse avec cette question un peu plus indépendante de la bibliothèque.)

32
Zardoz

(mis à jour pour le rendre plus lisible)

C'est ainsi que les chemins relatifs sont supposés fonctionner.

Imaginez que l'adresse actuelle est la suivante:

Absolute:protocol://some.domain.name/dir1/dir2/filename


Si vous ne spécifiez qu'un nouveau nom de fichier "foo", vous obtenez le même protocole, l'hôte et les répertoires, seul le nom du fichier est modifié:

Relatif:foo

Absolute:protocol://some.domain.name/dir1/dir2/foo


Si vous spécifiez un chemin complet "/ dir3/filename2", vous obtenez le même protocole et le même nom d'hôte, mais avec un autre chemin:

Relative:/dir3/filename2

Absolute:protocol://some.domain.name/dir3/filename2


Vous pouvez également spécifier le nom d'hôte "//another.domain.name/dir5/filename3" et obtenir le même protocole mais un autre hôte, dir et nom de fichier:

Relative://another.domain.name/dir5/filename3

Absolute:protocol://another.domain.name/dir5/filename3


Ce qui pourrait être déroutant, c’est qu’un serveur Web en interne peut ajouter un/à la fin de l’URL si l’URL spécifiée pointe vers un répertoire et non vers un fichier.

protocol://some.domain.name/somename

Si "quelque chose" est un répertoire vers lequel le serveur Web peut le traduire (possible avec une redirection)

protocol://some.domain.name/somename/


METTRE À JOUR

As cameron a déclaré dans un commentaire: Pour référence, voir l'étape 6 de la section 4 de RFC 1808

55
some

On dirait que http://code.google.com/p/js-uri/ est la bibliothèque de choix pour la manipulation des URL en général et pour ce type de calcul absolu-relatif en particulier:

new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()
0
Partly Cloudy