Что является хорошей практикой для перенаправления xhr или запроса на выборку на новую страницу?

#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?