И запрос и ответ – текстовые сообщения. Они имеют одинаковую структуру:
1. Строка запроса/статуса. B первой строке содержится основная информация. Для запроса это HTTP-метод, путь, и версия протокола. Для ответа – версия протокола, код ответа, и опциональное пояснение. Значения следуют именно в таком порядке, и разделяются пробелами.
HTTP-методом может быть
POST
, GET
, и другие. Формально это любая строка которая явно ни на что не влияет, однако на практике сервер обрабатывает определенные методы с определенными общепринятыми особенностями. Например GET
не должен иметь тела запроса, а OPTIONS
не кэшируется.Код ответа - трехзначное число. Первая цифра определяет категорию статуса, всё число - конкретный статус. 1xx - информация от сервера (102 - запрос принят но будет обработан позже), 2xx - успех (201 объект успешно создан), 3xx - перенаправление (301 - сайт переехал навсегда), 4xx - ошибка клиента (404 Not Found), 5xx - ошибка сервера (507 кончилось место на диске).
2. Заголовки. Каждая последующая (до пустой) строка представляет заголовок. Заголовки – метаинформация сообщения в формате ключ-значение. Название отделяется от значения символом
:
.В заголовках приходят кодировка, размер тела, данные о кешировании, и т.д.. Стандартный набор доступных заголовков описан в спецификации. Пользователь имеет право придумывать собственные заголовки – раньше их было принято снабжать префиксом
X-
, но сейчас от этой практики отходят. Для запроса обязателен заголовок Host
.3. Тело (опционально). Отделяется от заголовков пустой строкой. Возможность запроса/ответа иметь тело может быть ограничена используемым HTTP-методом и кодом статуса. В теле содержится любая полезная нагрузка. Например ответ на HTTP запрос сайта содержит HTML-код страницы, который и отрисовывается браузером. Программа в ответ на HTTP запрос данных обычно получает текст ответа в более удобном для работы формате, например JSON или XML. Как именно отформатирован текст тела подскажет стандартный заголовок
Content-Type
.Разобраться с запросами и ответами поможет консольная утилита
curl
(с флагом -v
). Вот пример её работы для URL ITSobes.ru: