Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Передача данных query string Протокол HTTP

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

Аватары экспертов Хекслета

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

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

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

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
с нуля
Разработка фронтенд-компонентов для веб-приложений
1 декабря 10 месяцев
Иконка программы Онлайн-буткемп. Фронтенд-разработчик
Профессия
Новый с нуля
Интенсивное обучение профессии в режиме полного дня
15 декабря 4 месяца
Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
1 декабря 10 месяцев
Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
1 декабря 10 месяцев
Иконка программы PHP-разработчик
Профессия
с нуля
Разработка веб-приложений на Laravel
1 декабря 10 месяцев
Иконка программы Инженер по тестированию
Профессия
с нуля
Ручное тестирование веб-приложений
дата определяется 4 месяца
Иконка программы Node.js-разработчик
Профессия
с нуля
Разработка бэкенд-компонентов для веб-приложений
1 декабря 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
с нуля
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
1 декабря 16 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»