162 votes

Renvoyer une redirection en réponse à une demande XHR

Que se passe-t-il si le navigateur reçoit une réponse de redirection à une requête ajax ?

0 votes

238voto

greim Points 2669

Que se passe-t-il si le navigateur reçoit une réponse de redirection à une requête ajax ?

Si le serveur envoie une redirection (c'est-à-dire une réponse 302 plus un en-tête Location :), la redirection est automatiquement suivie par le navigateur. La réponse à l'en-tête deuxième (en supposant qu'il ne s'agit pas non plus d'une autre redirection) est ce qui est exposé à votre programme.

En fait, vous n'avez pas la possibilité de détecter si une réponse 302 a eu lieu. Si la redirection 302 mène à un 200, alors votre programme agit de la même manière que si la requête originale menait directement à un 200.

C'est à la fois mon expérience et la comportement indiqué dans la spécification .

Mise à jour de 2016 : Le temps a passé, et la bonne nouvelle est que la nouvelle API fetch() est conçu pour offrir un contrôle plus fin de la façon dont les redirections sont gérées avec un comportement par défaut similaire à celui de XHR. Cela dit, il ne fonctionne que si fetch() est implémenté. nativement . Versions polyfill de fetch() -qui sont basés sur XHR- continuer à avoir les limites de XHR . Heureusement, support de navigateur natif semble s'arrondir gentiment.

61 votes

Il est intéressant de noter que je suis arrivé à cette conclusion parce que je suis confronté à une situation où la redirection n'est apparemment pas suivie... cela se produit lorsque la redirection viole la politique de la même origine.

5 votes

@Gus ce qui est probablement logique

0 votes

Que doit-il se passer si la redirection aboutit à un 401 au lieu d'un 200 ? Il semble que je rencontre ce problème et que j'obtienne des erreurs avec jQuery. J'essaie donc de comprendre exactement ce que le navigateur/JS est censé faire.

7voto

jishi Points 10442

El ajax-request suivront cette redirection, à priori. Le contenu actuel ( .responseText , .responseXML ) sera le contenu de la page vers laquelle vous êtes redirigé.

Vous pourriez être en mesure d'intercepter la redirection ( status-code , location-header ) sur readyState 2 ou 3, mais je n'en suis pas sûr.

0 votes

Non, tous ces États ont exactement le même statut. Même la valeur de getAllResponseHeaders() est égal.

1voto

kissu Points 31

TLDR : c'est faisable avec fetch .
Plus d'informations ici : https://github.com/axios/axios/issues/932#issuecomment-515229573

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X