Jquery getResponseHeader всегда возвращает 'undefined'?
У меня есть форма, которую я отправляю через ajax. Я использую плагин jquery form. То, что я пытаюсь сделать, это получить заголовок "Местоположение", который возвращается с моего сервера. Я вижу это в firebug. Но всякий раз, когда я вызываю функцию getResponseHeader() в моем обратном вызове, он всегда возвращает "undefined".
Код:
form.ajaxForm({
dataType: 'xml',
data: {format: 'xml'},
resetForm: true,
success: function(xml,status,xhr){
var location = xhr.getResponseHeader('Location');
alert(location);
});
находится undefined. Но я вижу заголовок "Местоположение" в firebug. Что мне не хватает? Даже если я вызываю getAllResponseHeaders() из объекта xhr, он возвращает 'undefined'
Ответы
Ответ 1
Если это запрос CORS, вы можете увидеть все заголовки в инструментах отладки (например, Chrome- > Inspect Element- > Network), но объект xHR будет извлекать только заголовок (через xhr.getResponseHeader('Header')
), если такой заголовок представляет собой простой заголовок ответа:
-
Content-Type
-
Last-modified
-
Content-Language
-
Cache-Control
-
Expires
-
Pragma
Если он не находится в этом наборе, он должен присутствовать в заголовке Access-Control-Expose-Headers, возвращаемом сервером.
В этом случае, если это запрос CORS, вы можете получить заголовок Location
только для объекта XMLHttpRequest
, если и только если заголовок ниже также присутствует:
Access-Control-Expose-Headers: Location
Если у него нет запроса CORS, XMLHttpRequest
не будет проблем с его извлечением.
Ответ 2
XMLHttpRequest будет прозрачно следовать перенаправлению, поэтому в последнем запросе не будет заголовка, он уже последовали за перенаправлением, и вы видя заголовки ответов из этого запроса (а не начальный запрос, который имел заголовок Location
).
Ответ 3
Я делаю что-то подобное, используя метод rails/rest, возвращающий 201 "созданный" с заголовком Location для нового объекта и пустым телом. Метод jQuery ajax выкинет "parseerror", когда столкнется с этим, так как он ожидает json, но ничего не получит. Я просто поймаю перенаправление 201 в моем обратном обратном вызове так:
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
}
надеюсь, что это поможет!