#javascript #html #forms #http
Вопрос:
У меня есть форма, https://example.com/order/
которую я хочу проверить на стороне сервера после отправки. Если он действителен, я хочу, чтобы браузер перешел к https://example.com/summary/
нему . Если это неверно, я хочу вернуть сообщение об ошибке и остаться на той же странице.
Я знаю, как сделать это в двух запросах (например, возвращая перенаправление HTTP 302 вместо HTTP 200 с содержимым страницы), но я хочу сделать это только с одним запросом, потому что два кажутся слишком большими для такой простой задачи.
Во время моего исследования я нашел два возможных решения, оба ужасно плохих:
- Использование JavaScript для отправки формы и обработки ответов. Если ответ является HTTP 400, обработайте отображение ошибки. Если ответ является HTTP 200 — замените весь HTML-документ текстом ответа, обновите адрес страницы и историю браузера.
Мне не нравится это решение, потому что оно кажется слишком сложным для такой простой задачи, и я не уверен, возможно ли вообще удалить сценарии, которые уже загружены и запущены. Представьте
<script>setInterval(() => {console.log("side-effect")}, 1000);</script>
, что в HTML-коде есть что-то подобное, он будет продолжать работать даже после того, как я это сделаюdocument.open(); document.write(response); document.close();
. - Установите действие формы для отправки непосредственно на
/summary/
. Если форма действительна, верните HTTP 200 с содержимым страницы, и страница загрузится правильно. Если форма недействительна, верните HTTP 204 Без содержимого — это приведет к тому, что браузер останется на той же странице. Затем я могу включить сведения об ошибке в файл cookie или какой-либо другой заголовок ответа (HTTP 204 запрещает ответ содержать тело).Это я ненавижу еще больше, потому что это нарушило бы множество правил, лежащих в основе HTTP-связи клиент-сервер, с неправильным использованием статуса HTTP 204. Было бы здорово, если бы был аналогичный статус ответа на ошибку HTTP, который указывал браузеру оставаться на той же странице и разрешал текст ответа.
Итак, есть ли способ сделать это с помощью одного запроса, оставаясь при этом совместимым со стандартами и без побочных эффектов?
Ответ №1:
Нет, поддержка браузера для 204 отстой (вы просто получаете белый экран), и нет никакого способа уведомить пользователя о том, что пошло не так. 204 даже не подходит для вашего случая, потому что вы хотите использовать его в случае ошибки, но 204-это статус успеха.
В прежние времена мы просто показывали ошибку в полноэкранном режиме на странице результатов и просили пользователя нажать кнопку «Назад». Браузер сохраняет значения формы, чтобы они могли исправить свою ошибку, не теряя всю форму.
Выполнение 2 запросов—хорошая идея в большинстве случаев, хотя вы вроде как хотите отправить данные на сервер, а затем перенаправить на новую страницу после получения 303
кода статуса. Если вы этого не сделаете, пользователи повторно отправят форму, если нажмут кнопку «Назад», что почти всегда нежелательно.
Комментарии:
1. Это то, о чем я беспокоился, выполнение 2 запросов кажется избыточным и создаст ненужный трафик, но я думаю, что я соглашусь с этим, если это то, что является лучшей практикой. Также хороший момент для повторной отправки формы, хотя это произойдет при обновлении страницы вместо перехода назад.