172 votes

jQuery et l'en-tête de réponse AJAX

Donc j'ai cet appel AJAX de jQuery, et la réponse vient du serveur sous la forme d'une redirection 302. J'aimerais prendre cette redirection et la charger dans une iframe, mais lorsque j'essaie de voir les informations d'en-tête avec une alerte javascript, elles sont nulles, même si firebug les voit correctement.

Voici le code, si ça peut aider :

$j.ajax({
    type: 'POST',
    url:'url.do',
    data: formData,
    complete: function(resp){
        alert(resp.getAllResponseHeaders());
    }
});

Je n'ai pas vraiment accès au matériel côté serveur pour déplacer l'URL vers le corps de la réponse, ce qui serait pourtant la solution la plus simple. Toute aide pour l'analyse de l'en-tête serait donc fantastique.

3 votes

Si vous consultez cette question en 2017 ou plus tard, ne perdez pas de temps avec la plupart des réponses existantes. Si votre problème est le même que celui du PO, vous avez deux options : 1) configurer un serveur proxy qui post le serveur d'origine et extraire les données cibles et le JS frontal demandera ce serveur mandataire pour les données cibles. Ou, 2) modifier le code du serveur pour permettre CORS.

196voto

rovsen Points 1670

La solution de cballou fonctionnera si vous utilisez une ancienne version de jquery. Pour les versions plus récentes, vous pouvez également essayer :

  $.ajax({
   type: 'POST',
   url:'url.do',
   data: formData,
   success: function(data, textStatus, request){
        alert(request.getResponseHeader('some_header'));
   },
   error: function (request, textStatus, errorThrown) {
        alert(request.getResponseHeader('some_header'));
   }
  });

Selon les docs l'objet XMLHttpRequest est disponible à partir de jQuery 1.4.

5 votes

À partir de jQuery >= 1.5, il doit s'appeler jqXHR qui est un sur-ensemble d'un objet XHR.

139voto

acdcjunior Points 19898

Si c'est un Demande CORS vous pouvez voir tous les en-têtes dans les outils de débogage (tels que Chrome->Inspecter l'élément->Réseau), mais l'objet xHR ne récupérera que l'en-tête (par le biais de l'option xhr.getResponseHeader('Header') ) si un tel en-tête est un en-tête de réponse simple :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

S'il n'est pas dans cet ensemble, il doit être présent dans le fichier Contrôle d'accès-Exposition-Headers renvoyée par le serveur.

En ce qui concerne le cas en question, s'il s'agit d'une demande CORS, on ne pourra récupérer que l'adresse de l'utilisateur. Location par le biais de l'en-tête XMLHttpRequest si, et seulement si, l'en-tête ci-dessous est également présent :

Access-Control-Expose-Headers: Location

Si ce n'est pas une demande CORS, XMLHttpRequest n'aura aucun problème à le récupérer.

3 votes

@acdcjunior merci cela m'a aidé aussi, après avoir investi un certain temps pour trouver pourquoi il n'y avait pas de sortie dans l'en-tête de réponse

38voto

keithics Points 1155
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });

1 votes

Ne fonctionne pas pour moi. Peut-être que je fais la demande à un autre site ? ( cross site request using ajax )

9 votes

Pour les gens qui n'ont pas pu le faire fonctionner comme moi. C'est probablement parce que vous faites un accès inter-domaine que jquery n'utilise pas XHR. api.jquery.com/jQuery.get

0 votes

Ça a marché comme un charme +1

18voto

DRaehal Points 443

La triste réalité d'AJAX et de la redirection 302 est que vous ne pouvez pas obtenir les en-têtes du retour car le navigateur ne les donne jamais au XHR. Lorsqu'un navigateur voit un 302, il applique automatiquement la redirection. Dans ce cas, vous verriez l'en-tête dans firebug parce que le navigateur l'a obtenu, mais vous ne le verriez pas dans ajax, parce que le navigateur ne l'a pas transmis. C'est pourquoi les gestionnaires de succès et d'erreur ne sont jamais appelés. Seul le gestionnaire complet est appelé.

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

Voici quelques messages de stackoverflow sur le sujet. Certains de ces messages décrivent des astuces pour contourner ce problème.

Comment gérer une demande de redirection après un appel Ajax de jQuery ?

Prise en charge de 302 FOUND en JavaScript

Redirection HTTP : 301 (permanente) vs. 302 (temporaire)

10voto

PleaseStand Points 16718

L'objet XMLHttpRequest sous-jacent utilisé par jQuery. suivra toujours silencieusement les redirections plutôt que de renvoyer un code d'état 302. Par conséquent, vous ne pouvez pas utiliser la fonctionnalité de requête AJAX de jQuery pour obtenir l'URL renvoyée. Au lieu de cela, vous devez placer toutes les données dans un formulaire et soumettre le formulaire avec la fonction target attribut fixé à la valeur de l'élément name de l'iframe :

$('#myIframe').attr('name', 'myIframe');

var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);

form.appendTo(document.body);
form.submit();

Le serveur url.do La page sera chargée dans l'iframe, mais lorsque son statut 302 arrivera, l'iframe sera redirigé vers la destination finale.

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