Повернення переадресації як відповідь на запит XHR


Відповіді:


216

Що станеться, якщо браузер отримає відповідь про переадресацію на запит ajax?

Якщо сервер надсилає перенаправлення (він же відповідь 302 плюс заголовок Location: заголовок), за перенаправленням автоматично переходить браузер. Відповідь на другий запит (якщо припустити, що це ще не перенаправлення) - це те, що піддається вашій програмі.

Насправді у вас немає можливості виявити, чи відбулася відповідь 302. Якщо переспрямування 302 призводить до 200, то ваша програма діє ідентично, як ніби оригінальний запит приводив безпосередньо до 200.

Це було як моїм досвідом, так і поведінкою, закликаною у специфікації .

Оновлення 2016 року: Час минув, і хороша новина полягає в тому, що новий API fetch () пропонує специфічний контроль над тим, як керувати переадресаціями , з поведінкою за замовчуванням, аналогічною XHR. Тим НЕ менше, вона працює тільки тоді, коли вибірка () реалізована спочатку . Версії polyfill fetch () - основані на XHR - продовжують мати обмеження XHR . На щастя, підтримка рідного браузера, здається, добре завершує роботу.


47
Цікаво, що я дійшов до цього, оскільки переживаю ситуацію, коли переспрямовування, очевидно, не виконується ... це відбувається, коли переспрямовування порушує ту саму політику походження.
Гас

4
@Gus, що, мабуть, логічно
Дмитро

1
У випадку переадресації на 401 (або будь-яку помилку 4xx або 5xx) я вважаю, що ваша програма поводитиметься так, ніби запит веде безпосередньо до 401. Це не те, що ви бачите?
грейм

2
API RESTful може надсилати 201 та заголовок Місцеположення після запиту POST; див. restapitutorial.com/lessons/httpmethods.html .

1
Оновлення 2019 року: вимкнення не працює так, як ми очікували 3 роки тому):
lcjury

7

ajax-requestСлідуватиме , що перенаправляти AFAIK. Фактичний вміст ( .responseText, .responseXML) буде вмістом зі сторінки, на яку ви перенаправлені.

Можливо, ви зможете перехопити переадресацію ( status-code, location-header) на readyState2 або 3, але не впевнені в цьому.


Ні, всі ці штати мають точно такий же статус. Навіть значення рівня getAllResponseHeaders()дорівнює.
sebastianwagner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.