2010-12-06 23 views
16

Tengo un formulario que estoy enviando por ajax. Estoy usando el complemento de formulario jquery. Lo que intento hacer es obtener el encabezado 'Ubicación' que se devuelve desde mi servidor. Puedo verlo en firebug. Pero cada vez que llama a la función getResponseHeader() en mi devolución de llamada de éxito, siempre devuelve 'indefinido' .. Códigojquery getResponseHeader siempre devuelve 'indefinido'?

:

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

ubicación no está definido. Pero puedo ver el encabezado 'Ubicación' en firebug. ¿Qué me estoy perdiendo? Incluso si llamo getAllResponseHeaders() del objeto xhr, devuelve 'indefinido'

+0

Solo para agregar: esto ha sido probado tanto en Firefox como en Opera. Mismos resultados – demersus

Respuesta

25

Si se trata de una CORS request, puede ver todas las cabeceras de herramientas de depuración (tales como cromadas> Inspeccionar element-> Red), pero el objeto XHR sólo va a recuperar la cabecera (a través de xhr.getResponseHeader('Header')) si un encabezado de este tipo es una simple response header:

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

Si no lo es en este conjunto, que debe estar presente en la cabecera Access-Control-Expose-Headers devuelto por el servidor.

Sobre el caso en cuestión, si se trata de una solicitud CORS, uno sólo será capaz de recuperar la cabecera Location throgh el objeto XMLHttpRequest si, y sólo si, la cabecera de abajo también está presente:

Access-Control-Expose-Headers: Location 

Si no es una solicitud CORS, XMLHttpRequest no tendrá problemas para recuperarla.

+1

¡Esto fue todo! * arco * – GijsjanB

+0

Esta es la respuesta correcta, si tiene que usar CORS y tiene estos problemas. –

6

un XmlHttpRequest se transparently follow a redirect, por lo que la petición final no tendrá la cabecera, que ya ha seguido esa redirección y se está viendo la los encabezados de respuesta de esa solicitud (no la solicitud inicial que tenía el encabezado Location).

+0

El servidor genera una respuesta 201 Creado. Espero que jquery no interprete esto como una redirección. Y Firebug no muestra una segunda solicitud. – demersus

+0

@Nik - Aunque tiene un encabezado 'Location', ¿no? eso es una redirección. –

+0

Tiene un encabezado de ubicación, pero si entiendo los códigos de respuesta http, la serie 30x significa redirigir. no 20x 20x no implica acción adicional. El encabezado de ubicación debe ser informativo.¿Pero tal vez estoy equivocado? – demersus

3

Estoy haciendo algo similar usando la forma de rails/rest de devolver un 201 "creado" con un encabezado Location al nuevo objeto y un cuerpo vacío. El método ajax de jQuery arrojará un "parseerror" cuando se encuentre con este desde su esperado json pero sin obtener nada a cambio. Simplemente capturo el redireccionamiento 201 en mi devolución de llamada de error así:

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 
} 

Espero que esto ayude!

+0

Simplemente configure dataType: 'text' como arg, y puede capturar el 201 en la devolución de llamada completa (o incluso mejor: jqXHR.done). – GijsjanB

Cuestiones relacionadas