Можно ли использовать HTTP GET, если есть небольшие побочные эффекты?

Насколько я понимаю, GET должен быть идемпотентом - он не может ничего изменить в системе, и повторение должно всегда возвращать то же самое, если что-то еще не изменило состояние приложения.

Проблема в том, что на моем веб-сайте должно быть много небольших изменений в зависимости от того, видел ли пользователь какой-либо контент ранее. Я имею в виду, как уведомления, оповещения о новых сообщениях, сортировку контента на основе того, видел ли пользователь это или нет, сколько пользователей видели счетчики контента... Например, когда пользователь нажимает на уведомление, уведомление должно исчезнуть из его панели уведомлений и никогда не быть видел там снова, поэтому он что-то меняет - состояние уведомления, но я могу нажать F5 столько раз, сколько захочу, и он всегда возвращает одну и ту же страницу с той же информацией, теми же кнопками и т. д.

Могу ли я игнорировать этот побочный эффект как слишком маленький, и я могу использовать GET, или я должен заставить большинство ссылок и кнопок на сайте использовать POST, как я делаю со ссылками и кнопками, которые приводят к более "серьезным" изменениям? Я делаю это, создавая вокруг каждой из них формы с этими ссылками в виде действий формы и оригинальными кнопками в виде кнопок отправки формы, что мне кажется немного беспорядочным, и я не хочу, чтобы это было почти везде (или есть лучший способ?),

1 ответ

Решение

Это может быть решено с нескольких точек зрения, я буду освещать это с этой точки зрения:

Конечный результат здесь всегда одинаков, поэтому запрос идемпотентен.

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

Сравните это с запросом POST /questions (например, создает новый вопрос): каждый раз, когда вы повторяете этот запрос POST, создается совершенно новый ресурс. Вы ПОСТЫТЬ один раз, и /questions/12345 создается Вы повторяете тот же запрос, /questions/12346 создается Это не идемпотент.

Нет, вам не нужно превращать все эти запросы в запросы POST.

Другие вопросы по тегам