#javascript #ajax #fetch
#javascript #ajax #выборка
Вопрос:
Интересно, существует ли какая-либо стандартная / наилучшая практика для обработки следующего сценария:
Браузер выполняет запрос xhr на выборку, и в ответе должно быть указано, что браузер должен перейти в новое местоположение.
Примером может быть то, что пользователи отправляют сообщение чата, браузеры отправляют запрос на выборку, а ответ заключается в том, что пользователь не вошел в систему, и что браузер должен перейти на страницу входа.
Теперь вы могли бы просто ответить 3xx, и с помощью fetch это можно обработать следующим образом:
const response = await fetch(request);
if (response.redirected) {
window.location.href = response.url;
}
Однако это приведет к загрузке перенаправленной страницы 2 раза. Что очень некрасиво, и что еще хуже, если перенаправленная страница является внешней страницей, она будет выдавать.
Ответ №1:
Это не то, что вы обычно должны ожидать от своего клиента. Вместо этого ваш сервер не должен перенаправлять запросы JSON на HTML-страницы.
На вашем сервере, если запрос запрашивает JSON, вы должны ответить 401 Unauthorized
и документом JSON, содержащим информацию об ошибке.
Тот же запрос для HTML должен перенаправляться на страницу входа.
В большинстве серверных фреймворков есть способ определить, какой формат запрашивает данный запрос, и выдать правильный тип ответа.
Комментарии:
1. Что, если я захочу перенаправить другую страницу при успешном выполнении? Например, когда план оплаты выполнен успешно, я хочу перенаправить к истории заказов. Я предполагаю, что ответить 200 с новым местоположением в теле или заголовке ответа?
2. @Kasper Вам не следует разрабатывать API таким образом. Ваш API должен выводить HTML и HTTP-перенаправления только в ответ на запросы HTML, и он не должен выводить HTML или перенаправлять на страницы, которые выводят HTML в ответ на запросы XHR или JSON. Если вы хотите выполнить XHR, а затем «перенаправить» на новую страницу, ваш клиент должен ожидать ответа 200 или 201 и полезной нагрузки JSON, указывающей успех и, возможно, куда перенаправить пользователя, а затем перенаправить через
window.location.href
.3. Ах, да, это именно то, что я хотел сказать. Спасибо.
4. Да, это один из вариантов. Другим вариантом было бы отделить логическую серверную часть, чтобы API знал, как создать запись, но не делал предположений о том, куда клиент захочет перенаправиться. Ваш клиент может выполнить вызов API, а затем он должен знать, как отобразить результаты, будь то вставка результирующей записи в список, который уже отображается, или загрузка нового маршрута. Обычно API возвращают информацию о созданной записи, они не сообщают клиенту, что делать с этой информацией.
5. Я понимаю, спасибо. Что ж, здесь много унаследованного, и серверная часть хочет быть «главной». Вы бы поместили новое местоположение в заголовок «Location» или в тело ответа json?