2010-12-06 5 views
16

J'ai un formulaire que je soumets via ajax. J'utilise le plugin jquery form. Ce que j'essaie de faire est d'obtenir l'en-tête 'Location' qui est retourné par mon serveur. Je peux le voir dans Firebug. Mais chaque fois que j'appelle la fonction dans mon rappel de succès, il revient toujours 'undefined' ..jquery getResponseHeader renvoie toujours 'indéfini'?

code getResponseHeader():

form.ajaxForm({ 
    dataType: 'xml', 
    data: {format: 'xml'}, 
    resetForm: true, 
    success: function(xml,status,xhr){ 
    var location = xhr.getResponseHeader('Location'); 
    alert(location); 
    }); 

emplacement est défini. Mais je peux voir l'en-tête 'Location' dans firebug. Qu'est-ce que je rate? Même si je l'appelle getAllResponseHeaders() de l'objet XHR, il retourne « undefined »

+0

Juste pour ajouter: Cela a été testé dans Firefox et l'opéra. Mêmes résultats – demersus

Répondre

25

Si cela est un CORS request, vous pouvez voir tous les en-têtes des outils de débogage (tels que Chrome-> Vérifier Element-> Réseau), mais l'objet XHR sera uniquement récupérer l'en-tête (via xhr.getResponseHeader('Header')) si un tel en-tête est un simple response header:

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

Si ce n'est pas dans cet ensemble, il doit être présent dans l'en-tête Access-Control-Expose-Headers renvoyé par le serveur.

A propos de l'affaire en question, si elle est une demande CORS, on ne sera en mesure de récupérer l'en-tête Location throgh l'objet 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.

+1

C'était tout! * bow * – GijsjanB

+0

C'est la bonne réponse, si vous devez utiliser CORS et avoir ces problèmes. –

6

Un XMLHttpRequest transparently follow a redirect, de sorte que la demande finale aura pas l'en-tête, il est déjà suivi que redirect et vous voyez la les en-têtes de réponse de cette demande (pas la demande initiale qui avait l'en-tête Location).

+0

Le serveur génère une réponse 201 Created. J'espère que jquery n'interprète pas cela comme une redirection. Et firebug ne montre pas une deuxième requête. – demersus

+0

@Nik - Il a un en-tête 'Location' cependant, non? c'est une redirection. –

+0

Il possède un en-tête de localisation, mais si je comprends bien les codes de réponse http, 30x signifie une redirection. pas 20x. 20x n'implique aucune autre action. L'en-tête de l'emplacement doit être informatif.Mais peut-être que je me trompe? – demersus

3

Je suis en train de faire quelque chose de similaire en utilisant les rails/la façon restante de renvoyer un 201 "créé" avec un en-tête Location au nouvel objet et un corps vide. La méthode ajax de jQuery lancera une "parseerror" lorsque vous rencontrerez ceci car il attendra json mais ne récupérera rien. J'attrape simplement la redirection 201 dans mon rappel d'erreur comme suit:

function request_error(req, textStatus, errorThrown) 
{ 
    if (req.status == 201) { 
     var created_loc = req.getResponseHeader('Location'); 
     console.log('(201) created: ' + created_loc); 

     // ... manual redirect here i.e. issue another ajax request to created_loc 
     return; 
    } 

    // ... handle an actual error here 
} 

espérons que cela aide!

+0

dataType Il suffit de définir: « texte » comme arg, et vous pouvez prendre le 201 dans le rappel complet (ou mieux encore: jqXHR.done). – GijsjanB

Questions connexes