JaLoveAst1k
@JaLoveAst1k

Какова схема работы http-запроса?

Здравствуйте, возник следующий вопрос.

Возможен ли вариант, что когда я произвожу запрос с клиента, то сервер его обработает, но ответ я не получу (проблемы с сетью, 3g, например)?

Т.е. на сервер добавится некая переменная в базу, а я буду думать, что запрос не прошел - и сделаю еще один, и еще один и т.д...

Вроде бы программирую относительно давно, но как-то не задумывался об этом никогда. Буду благодарен за рекомендации что почитать по теме.
  • Вопрос задан
  • 3066 просмотров
Решения вопроса 1
LucemFerre
@LucemFerre
Вопрос, скорее, связан не со спецификой работы http-запроса, а с работой сервера и клиента на уровне приложения.

Дважды отправленный запрос будет дважды обработан.

Для избежания подобных случаев существует много разных вариантов. Чаще всего, это зависит от логики. К примеру, при модификации данных такое поведение, чаще всего, не страшно (дважды отредактировав, к примеру, свой логин, в результате получим правильный результат). При вставки данных часто бывает достаточно проверить, не записывались ли последний раз этим пользователем в эту таблицу точно такие же данные (к примеру, дважды отправленный комментарий).

Более универстальный способ - делать к каждой форме подпись, которая прикрипрена к пользователю и генирируется для каждой формы новая. После обработки запроса запись удаляется. Соответственно, отправив второй раз форму мы увидим, что подписи такой уже нет, и запрос обрабатывать не надо. Обычно, такое делается в целях безопасности, но, как побоный эффект, уберегает от повторной отправки форм.
Из минусов - дополнительный оверхед, нужно корректно обрабатывать ошибочные ситуации. К примеру, обновить данные на странице, которые пользователь хотел модифицировать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Согласно спецификации HTTP все запросы делятся на идемпотентные - не меняющие состояние серверной стороны (например, GET) и неидемпотентные - изменяющие состояние серверной части (например, POST).

Дальше в том же стандарте написано, что с неидемпотентными запросами все должны обращаться весьма аккуратно - например, браузерам желательно предупреждать пользователей, что они дают команду на переотправку неидемпотентного запроса, а прокси-серверам запрещается в случае неполного успеха перезапрашивать неидемпотентный запрос.

А в целом, всё как сказали раньше - если сервер специально не обрабатывает данный факт, а клиентская сторона не задумываясь повторяет POST-ы, то данная ситуация не исключена.

С другой стороны, изменение какой-либо значимой для логики прикладного процесса серверной переменной по факту получения GET-запроса - явная ошибка программиста, вернее, несоблюдение им стандартов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы