Помимо того, что данные на сервер можно передавать через body, которое используется при POST запросах и отправке форм, мы также можем передать так называемую строку запроса query string. Это параметры ключ=значение, которые располагаются в request line после указания глагола POST или GET.
POST /login?key=value HTTP/1.1
Стоит сказать, что указатель на конкретную страницу может отсутствовать и параметры можно передавать на основную страницу домена.
GET /?key=value HTTP/1.1
query string имеет такой же формат, как и строка в body при POST запросе, только в начале ставится знак ?
. После него мы можем передавать параметры key=value&key2=value2
и так далее.
Параметры query string не имеют никакого отношения к GET-запросам, хотя многие разработчики называют их GET-параметрами. На собеседованиях иногда задают вопрос: "Можно ли одновременно отправить POST и GET параметры?". Правильный ответ — конечно можно, так как никакой связи между ними нет. Более того, в некоторых языках существуют способы получения этих данных отдельно друг от друга. Например, в PHP есть глобальный массив $_REQUEST
, в который попадают как параметры, переданные через query string, так и переданные в POST.
Но как понять, когда и для чего использовать query string? Для этого нужно определить, что на самом деле значат глаголы HTTP. Семантика HTTP-глаголов выражается не только в том, какой вам будет возвращен ответ, а еще и в том, как можно с ним работать. Глагол GET считается идемпотентным. Это означает, что его повторное выполнение всегда возвращает один и тот же результат, т.е. это обычный запрос. Мы спрашиваем систему о чем-то, она возвращает нам данные и при этом не изменяет своего внутреннего состояния. Таким образом любой повторный запрос отработает точно так же — детерминировано. В качестве аналогии можно привести чистую функцию. В реальности состояние системы конечно же может поменяться и мы не можем это контролировать, поэтому кэширование не является тривиальной задачей.
POST-запрос, напротив, не является идемпотентным и предназначен для изменения данных. Таким образом повторный запрос может приводить к другим результатам. Если первым POST-запросом мы удаляем данные, то вторым получим ошибку 404. Такие запросы никогда не кешируются.
Поисковые роботы ходят по сайтам только по GET-ссылкам, так как они учитывают семантику и знают, что GET-запросы можно делать безболезненно и с сайтом ничего страшного не произойдет.
Параметры query string в GET-запросах используются при работе с формами, которые бывают как минимум двух типов: на изменение, создание или добавление данных и на их выборку. Именно при разработке второго типа форм и используется query string. Это может быть какая-то фильтрация или поисковая форма. Если мы в поисковике наберем запрос, например, какое-то слово и нажмем кнопку Поиск, то увидим, что нас отправит на страницу, в URL которой будет отправлен query string. Это очень важный момент, так как именно благодаря этому мы не производим никаких изменений и можем дать ссылку на этот запрос. Очень важно придерживаться семантики глаголов. Например, в некоторых старых банковских системах запросы почему-то реализовывались через POST. При таком подходе нельзя не только дать ссылку на запрос, но даже простое обновление страницы с помощью F5 приводит к повторной отправке данных.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.