Протокол связи HTTP — HyperText Transfer Protocol был разработан специально для передачи данных и просмотра интернет-страниц. Каждое взаимодействие по HTTP выглядит как общение между пользователем и сервером: человек с помощью клиента делает запрос (HTTP Requests) к серверу, а сервер даёт ответ — допустим, отображает сайт в браузере.
Фактически запросы представляют собой некие информационные сообщения, которые клиент передаёт на сервер с целью выполнения какого-либо действия. У каждого HTTP Requests должен быть задан URL-адрес и метод, а основой выступает хедер (HTTP-заголовок).
HTTP-запросы наполнены несколькими текстовыми строками, которые закодированы в ASCII. Версии HTTP/1.1 и ранее предполагали использование данных в виде обычного текста. В более совершенной версии HTTP/2 текстовую информацию стали разделять на фреймы.
Структура HTTP-запросов
HTTP-запросы могут выглядеть следующим образом: GET https://www.cloud4y.ru/ HTTP/1.1
Здесь вы можете видеть, что в качестве метода используется GET, обращение идёт к ресурсу https://www.cloud4y.ru, а в качестве протокола используется версия HTTP/1.1.
Для большей наглядности изобразим это так:
Традиционно запросы обладают структурой следующего вида:
- Стартовая строка. Необходима для описания запроса или статуса. В ней сообщается версия протокола и другие сведения. Это может быть запрашиваемый ресурс или код ответа (например, ошибки). Длина — ровно одна строчка.
- HTTP-заголовок. Выглядит как несколько строчек текста, в которых уточняется запрос или описывается содержимое тела сообщения.
- Пустая строка. Она необходима, чтобы сообщить об успешной отправке метаданных конкретного запроса.
- Тело запроса. В нём хранится информация о запросе или документ, который отправляется в ответе на запрос.
А теперь чуть более детально.
Стартовая строка
Стартовая строка HTTP-запроса включает в себя три основных компонента, метод запроса, его цель и версию протокола передачи данных.
Метод — короткое слово, которое указывает, что требуется сделать с запрашиваемым ресурсом. Чаще всего встречаются методы глагольной формы (GET, PUT или POST) или существительные (HEAD, OPTIONS). GET, например, даёт серверу понять, что пользователю требуются некие данные, а POST означает, что пользователь отправляет данные на сервер.
Цель запроса фактически является указателем нужного пользователю URL. Состоит из протокола, URL или IP-адреса, пути к хранящемуся на сервере ресурсу. Также в состав цели запроса могут входить указание порта, параметры запроса.
Версия используемого протокола передачи данных. Сейчас распространены версии HTTP/1.1 и HTTP/2. От протокола зависит структура данных, идущих вслед за стартовой строкой.
Отметим, что в стартовой строке могут храниться и другие полезные сведения. Например, User-Agent header — данные об используемом юзер-агенте, то есть браузере. Или Referer header — здесь подразумевается URL, с которого поступил запрос.
HTTP-заголовок
Заголовки выглядят как пара _имя:значение_. Строка не зависит от регистра, а структура значения определяется заголовком. Хедер выглядит как одна, порой чрезвычайно длинная строка. Заголовки используются для передачи вместе с запросом дополнительных сведений и могут принадлежать к одной из четырёх категорий.
- Главные заголовки — необходимы для любых типов сообщений и не зависят от данных, которые планируется передавать.
- Заголовки запроса — задают параметры запрашиваемых данных или определяют параметры со сведениями о совершающем запрос клиенте.
- Заголовки ответа — в них содержится информация об ответе сервера.
- Заголовки сущностей — позволяют описать содержимое тела сообщения.
Пустая строка
На самом деле эта строка не пуста, она содержит параметр CTRLF, обозначающий конец заголовка.
Тело запроса
Тело HTTP-запроса может быть не у всех запросов. Например, для методов GET, HEAD, DELETE, OPTIONS тело, как правило, не нужно. А вот для методов типа POST оно необходимо — чтобы отправлять на сервер информацию для обновления, например.
Тело запроса условно делится на две категории, одноресурсное и многоресурсное. К первой категории относятся тела запроса, состоящие из одного обособленного файла с двумя заголовками: Content-Type и Content-Length.
Многоресурсные же тела состоят из нескольких частей, каждая из которых содержит свой бит информации. Эти части связаны с HTML-формами.
Помимо HTTP-запросов существуют ещё и ответы. Но это уже совсем другая история.