2010-07-08 6 views
11

Donc- J'ai cette requête ajax, voir-. Blonde, environ 6 pieds de haut, ressemble à ceci:Découvrez où Jquery ajax demande est redirigé vers

$.ajax({ 
    url: 'http://example.com/makeThing', 
    dataType: 'html', 
    type: 'POST', 
    data: { 
     something:someotherthing 
    }, 
    complete: function(request, status) { 
     console.log("headers=" + request.getAllResponseHeaders();); 
    } 
}); 

Ce qui se passe est que la demande de '/ makeThing' renvoie une redirection 302 à une deuxième URL: 'getThing/abc123'. Tout ce que je veux faire est de savoir ce qu'est cette seconde url (par programmation - ça sera différent à chaque fois, donc juste vérifier dans firebug ne m'aide pas). J'ai essayé de replacer les en-têtes de réponse qui reviennent au rappel «complet», mais cela me donne juste ce qui est revenu sur la deuxième demande.

Contraintes: -Je n'ai aucun contrôle sur le serveur sur lequel il s'exécute, juste le js. cadres de commutation -Can si je dois (dojo? Prototype?)

Idéalement, je ferais une sorte de demande d'en-tête uniquement à/makeThing pour savoir ce que l'url de redirection est en obtenant seulement les en-têtes de la réponse 302 initiale.

A défaut (puisque jquery suit automatiquement les redirections et ne semble pas avoir le moyen de passer d'une requête à l'autre), je récupère la réponse finale et l'utilise pour obtenir l'URL de ... quelque chose? L'objet de requête, peut-être?

TLDR: Envoi d'une requête ajax. Framework suit automatiquement la redirection 302 qui en résulte. Comment puis-je savoir où il a été redirigé?

EDIT, Précision: L'URL finale sera différente à chaque appel de temps « makeThing » provoque le serveur pour créer ce qui est ensuite hébergé chez « getThing/abc123 »

+0

Vérifiez avec Firebug. –

Répondre

0

Pourquoi ne branchez pas simplement l'URL 'http://example.com/makeThing' dans votre navigateur et voir où vous vous retrouvez?

+0

La redirection peut dépendre des données - c'est-à-dire si elles sont valides -> rediriger vers la page suivante. Si c'est invalide -> rediriger pour éditer la page. Il pourrait également agir différemment si c'est un XHR au lieu d'une demande régulière. Ce n'est pas rare dans Rails, par exemple. –

+0

Comme mentionné dans ma correction, l'url final sera très à chaque demande de faire. makeThing génère une 'chose' avec l'id 'abc123' qui est ensuite accessible à getThing/abc123. C'est pourquoi j'ai besoin d'accéder à la chose par programmation. – Fishtoaster

0

Si vous démarrez firebug, puis ouvrez la console, vous pouvez suivre où va la requête. Lorsque vous voyez que la requête AJAX a terminé le traitement, développez cet élément de la console et vous verrez les demandes impliquées et les en-têtes de réponse.

+0

Désolé si je n'étais pas particulièrement clair sur ce point: makeThing est une fonction de générateur - où il redirige vers est différent chaque fois qu'il est appelé, donc j'ai besoin d'un moyen de le faire par programmation. – Fishtoaster

4

Si possible, votre serveur mis un en-tête sur ces pages (les pages de destination, et non pas la redirection d'un), par exemple de l'en-tête "current-location", alors vous pouvez le faire:

$.ajax({ 
    url: 'http://example.com/makeThing', 
    dataType: 'html', 
    type: 'POST', 
    data: { 
     something:someotherthing 
    }, 
    complete: function(request, status) { 
     var location = request.getResponseHeader("current-location"); 
    } 
}); 

Oui, ce est un peu hacky, mais puisque la redirection est gérée en interne dans l'objet XmlHttpRequest (un événement auquel vous ne pouvez pas accéder), vous n'avez pas beaucoup de choix.

You can check the spec, c'est le destiné comportement pour XmlHttpRequest:

Si l'origine de l'URL véhiculée par l'en-tête de localisation est la même origine avec l'origine XMLHttpRequest et la redirection ne viole pas les précautions de boucle infinie, suivre de manière transparente la redirection tout en observant les règles d'événement de demande de même origine.

+1

Cela fonctionnerait si j'avais accès au serveur. :(Tout ce que je peux changer est Javascript – Fishtoaster

+2

@Fishtoaster - AFAIK, Vous n'avez pas d'options alors, ce n'est tout simplement pas exposé, au moins cross-browser.Vous pouvez lire le contenu pour savoir quelle page vous êtes sur, ou une approche alternative? –

+0

C'est probablement ce que je vais devoir faire.Brittle, mais je suppose que c'est tout ce qu'il y a. – Fishtoaster

2

Cela peut ne pas aider votre situation particulière, mais quand j'eu le même problème, j'ai remarqué la page je me suis retrouvé sur après la redirect avait un indice dans le code HTML:

<meta property="og:url" content="THE_URL_OF_THE_PAGE" /> 

Certaines pages de script sont des extraits dans les fichiers utilisés pour ajouter des commentaires sur Facebook, et ceux-ci peuvent parfois contenir aussi l'URL actuelle. Ou même de manière flagrante que cela:

<a href="http://www.facebook.com/sharer.php?u=THE_URL_OF_THE_PAGE"> 
0

qui est vraiment dommage que nous ne pouvons pas saisir cette tête ... mais comme Magnus a fait remarquer, vous pouvez essayer de lire un contenu unique de cette page qui laissera vous déterminez quelle page vous a été acheminée ...