Из чего состоит HTTP-запрос?

HTTP – популярный протокол прикладного уровня модели OSI. По этому протоколу общаются два участника: клиент и сервер. Клиент формирует и отправляет серверу запрос, сервер его обрабатывает и присылает ответ.

И запрос и ответ – текстовые сообщения. Они имеют одинаковую структуру:

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:
Из чего состоит HTTP-запрос?