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: