Как выглядит необработанный 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, строку запроса и тело запроса.