Как выглядит необработанный HTTP-запрос

HTTP-запрос определяет следующее:

  • Метод (обязательный) - (Пример: GET)
  • Хост (обязательно) - (Пример: www.bing.com)
  • Путь (обязательно) - (Пример: / search)
  • Версия HTTP (обязательно) - (Пример: HTTP / 2)
  • Заголовки (необязательно) - (Пример: Content-Type: application/json)
  • Строка запроса (необязательно) - (Пример: ?q=test)
  • Body (необязательно) - (Пример: {“q”: “test”})

Обзор HTTP

HTTP - один из многих протоколов (стратегий связи), используемых для передачи данных с одного компьютера на другой через Интернет. Это протокол, который браузеры в основном используют для связи с веб-сайтами.

Например, когда вы переходите на www.wikipedia.org, создается HTTP-запрос, который передается на серверы Википедии, которые, в свою очередь, обрабатывают и передают HTTP-ответ обратно в браузер.

Протокол HTTP - это «текстовый протокол», что означает, что эта стратегия использует читаемые человеком символы в качестве средства связи.

Так, например, запрос на поиск test на сайте bing.com по адресу https://www.bing.com/search?q=test выглядит так:

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

Довольно круто, правда? Давайте разберем этот запрос.

Гостья

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше примере вторая строка с «Хостом» определяет, на какой веб-сайт должен быть сделан запрос. В этом случае запрос будет отправлен на сайт Bing. Если бы это было изменено на «www.google.com», запрос отправился бы в Google.

Понятно?

Метод

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше запросе «GET» - это метод HTTP, с помощью которого запрос указывает то, что он обычно хочет делать.

Вот несколько распространенных методов HTTP и их предназначение:

  • GET - извлекает данные, например статью в блоге.
  • POST - создает данные, как новая статья в блоге.
  • PUT - заменяет данные, как существующая статья в блоге.
  • DELETE - удаляет данные, например существующую статью в блоге.

Итак, в нашем примере запроса с использованием метода GET говорится: «Пожалуйста, получите некоторые данные для меня».

Есть и другие методы HTTP, которые можно увидеть в этих веб-документах MDN.

Путь

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше примере /search в первой строке - это путь. Вместе с методом путь сообщает веб-сайту, что запрос конкретно хочет сделать.

В этом случае GET /search говорит: «Пожалуйста, получите результаты поиска для меня».

Заголовки

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше примере строки под Host являются заголовками. Заголовки - это дополнительные данные, которые помогают веб-сайту определить, какой ответ на запрос.

Например, Accept: */* сообщает веб-сайту, что любой тип ответа допустим. Это можно было бы сделать более конкретным.

User-Agent: curl/7.54.0 сообщает веб-сайту, какое приложение используется для отправки запроса.

Например, обычно это может быть что-то вроде Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0, если вы отправляете запрос из версии Firefox для Mac.

В приведенном выше случае для выполнения запроса использовался инструмент командной строки cURL.

Любые дополнительные заголовки могут быть предоставлены в следующих строках. Известный тип заголовка - это заголовок «cookie», который используется для передачи повторно используемых данных на веб-сайт при каждом запросе.

Например, при входе в систему «сеанс» пользователя может каждый раз передаваться на веб-сайт, поэтому пользователю не нужно передавать имя пользователя и пароль каждый раз, когда делается запрос.

Строка запроса

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше примере ?q=test - это строка запроса, которая предоставляет веб-сайту дополнительную информацию, чтобы помочь ему выполнить свой запрос.

Помните, что в этом примере мы говорим Bing: «Пожалуйста, получите результаты поиска для меня». Мы еще не указали аргументов, что искать. Строка запроса предоставляет эти аргументы.

Давайте взглянем:

?q=test

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

В случае нашего запроса мы говорим: «Пожалуйста, получите результаты поиска для меня, где поисковое значение имеет значение« test »».

Если нам нужно передать дополнительные значения в строке запроса, мы разделяем их амперсандом (&) следующим образом:

?q=test&query_argument_2=value_2&query_argument_3=value=3

Имеет смысл?

Тело запроса

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

{ “q”: “test” }

Строка запроса - не единственный способ передать дополнительную информацию на веб-сайт. Тело запроса - это средство сделать то же самое.

Обычно он не используется с GET запросом, но я добавил его выше для примера. Как правило, он используется с такими методами, как POST и PUT, которые более тяжелы при передаче данных, поскольку они определяют данные, которые должны быть записаны.

В приведенном выше примере после заголовков и пустой строки { “q”: “test” } - это тело запроса, которое предоставляет дополнительную информацию веб-сайту, чтобы помочь ему выполнить свой запрос, так же, как это делает строка запроса.

Передача данных в теле имеет несколько преимуществ перед строкой запроса и несколько недостатков.

Преимущества

  • Ограничений по размеру данных нет. Строки запроса имеют ограничение на максимальный размер (зависит от браузера) и поэтому не подходят для передачи большого количества информации.
  • Данные записываются и извлекаются в меньшем количестве мест и, следовательно, более безопасны. Размещение конфиденциальных данных, таких как пароли, в строках запроса проблематично (подробнее читайте в этой статье HttpWatch).
  • Лучше для отправки других форматов передачи данных, таких как JSON и XML. Хотя эти форматы можно поместить в строку запроса, обычно этого не делается. Строки запроса выглядят очень некрасиво с JSON или XML в них.

Недостатки

  • Тело запроса скрыто от пользователя и не может быть легко передано другому человеку. Строки запроса хороши для ситуаций типа «эй, проверьте эту ссылку», поскольку значения хранятся в ссылке и могут быть легко скопированы / вставлены другому человеку.

Версия HTTP

GET /search?q=test HTTP/2
Host: www.bing.com
User-Agent: curl/7.54.0
Accept: */*

В приведенном выше примере HTTP/2 в первой строке - это версия HTTP. Различные версии HTTP по-разному обрабатывают детали взаимодействия между машинами. Сегодня обычно используются версии HTTP / 1.1 и HTTP / 2.

Вы можете прочитать Подробнее о различных версиях HTTP в веб-документации MDN.

Резюме

HTTP - это текстовый протокол, активно используемый браузерами для связи с веб-сайтами.

HTTP-запросы определяют хост, метод, путь, заголовки, версию HTTP, строку запроса и тело запроса.