Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете
Протокол HTTP

Передача данных query string

Помимо того, что данные на сервер можно передавать через 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

Параметры 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. Это может быть какая-то фильтрация или поисковая форма. Если мы в поисковике наберём запрос, например, какое-то слово и нажмем кнопку Поиск, то увидим, что нас отправит на страницу, в URI которой будет отправлен query string. Это очень важный момент, так как именно благодаря этому мы не производим никаких изменений и можем дать ссылку на этот запрос. Очень важно придерживаться семантики методов. Например, в некоторых старых банковских системах запросы почему-то реализовывались через POST. При таком подходе нельзя не только дать ссылку на запрос, но даже простое обновление страницы с помощью F5 приводит к повторной отправке данных.


Дополнительные материалы

  1. Query String / Wikipedia
  2. RFC 3986 (соответствующий стандарт)

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».