Получение фактического URL после POST, который перенаправляется с помощью jquery.ajax()
Я следую примеру PRG (Post-Redirect-Get) в своем веб-приложении и для выполнения большинства моих POST использует что-то вроде следующего:
$.ajax({
type: 'POST',
url: 'A.html',
data: '....',
statusCode: {
302: function() {
alert("302"); // this is never called
},
200: function() {
alert("200");
},
},
success: function (data, textstatus) {
alert('You are now at URL: ' + ??);
},
error: function (data) {
},
complete: function (jqXHR, textstatus) {
alert('You are now at URL: ' + ??);
},
});
Мне нужно получить URL ПОСЛЕ любого перенаправления, т.е. URL окончательного GET, который вызвала функция .ajax(). Например, POST для A.html может перенаправляться на B.html или C.html(всегда через 302). Как получить конечный URL?
Я использую jquery 1.5.1, и использование прокси-сервера стало свидетелем того, что jquery молча следит за перенаправлениями - что я доволен. Меня не волнует ни один из URL-адресов, на которые ответил 302 - я бы просто хотел узнать URL-адрес окончательного запроса в то время, когда запущены .ajax() "success:" или "complete:".
Ответы
Ответ 1
Я, наконец, решил эту проблему, добавив дополнительный заголовок во все мои ответы (например, "X-MYAPP-PATH:/Admin/Index" ).
Мой javascript может быть изменен на следующее:
success: function (data, textstatus, xhrreq) {
alert('You are now at URL: ' + xhrreq.getResponseHeader("X-MYAPP-PATH"));
},
Я все же верю, однако, что jquery должен быть в состоянии дать мне текущий URL, поэтому я считаю это взломом.
Ответ 2
Лучшим решением является предоставление jQuery ajax с помощью специального объекта xhr следующим образом:
var xhr = new XMLHttpRequest();
$.ajax({
url: '/url',
type: 'post',
data: '...',
xhr: function() {
return xhr;
}
});
Затем вы можете получить доступ к текущему URL-адресу в любом обратном вызове
success: function () {
alert('You are now at URL: ' + xhr.responseURL);
}
Ответ 3
Сначала попробуйте выяснить код состояния, возвращаемый перенаправлением (обычно > 300).
success: function (data, textstatus, xhrReq) {
//if the status is greater than 300
if(xhrReq.status > 300) {
alert('You are now at URL: ' + xhrRequest.getHeader("Location"));
}
},
Еще один момент, который следует отметить, что порядок выполнения:
success\failure → statusCode function → Complete