Структура HTTP-ответа
Структура HTTP-ответа
В прошлом уроке мы разобрали HTTP-запрос. Теперь посмотрим, что присылает сервер в ответ. HTTP-ответ так же состоит из трёх частей: стартовая строка, заголовки и тело. Но содержание другое.
Три части HTTP-ответа
HTTP/1.1 200 OK ← статусная строка
Content-Type: text/html; charset=utf-8 ← заголовки
Content-Length: 1250
Set-Cookie: session_id=abc123
Cache-Control: max-age=3600
← пустая строка
<!DOCTYPE html> ← тело ответа
<html>
<head><title>Example</title></head>
<body><h1>Hello!</h1></body>
</html>
Статусная строка
Состоит из трёх элементов:
ВЕРСИЯ_ПРОТОКОЛА КОД_СТАТУСА ПОЯСНЕНИЕ
HTTP/1.1 200 OK
Код статуса — трёхзначное число, которое говорит клиенту о результате обработки запроса. Первая цифра указывает категорию:
- 1xx — информационные («я работаю над твоим запросом»)
- 2xx — успех («вот то, что ты просил»)
- 3xx — перенаправление («это переехало туда»)
- 4xx — ошибка клиента («ты просишь то, чего нет»)
- 5xx — ошибка сервера («у меня проблема»)
Детально коды статуса разберём в следующем модуле.
Заголовки ответа
Заголовки ответа дополняют статус метаданными:
Content-Type — формат данных в теле ответа. Самый важный заголовок для браузера:
Content-Type: text/html; charset=utf-8
Content-Type: application/json
Content-Type: image/png
Без правильного Content-Type браузер не знает, как обработать ответ: отрендерить как страницу, показать как картинку или предложить скачать как файл.
Content-Length — размер тела в байтах. Позволяет клиенту понять, что все данные получены:
Content-Length: 4523
Set-Cookie — сервер просит браузер сохранить cookie:
Set-Cookie: session_id=abc123; HttpOnly; Secure; Max-Age=3600
Cache-Control — как кэшировать ответ:
Cache-Control: max-age=3600, public
Cache-Control: no-cache
Cache-Control: no-store
Server — какой веб-сервер отвечает (информационный, не всегда присутствует):
Server: nginx/1.25.0
Server: cloudflare
Location — используется с кодами 3xx для перенаправления:
Location: https://www.example.com/new-page
Тело ответа
Тело ответа содержит собственно данные: HTML-страницу, JSON, картинку, CSS-файл и т.д. Для бинарных данных (изображения) тело — последовательность байт. Для текстовых (HTML, JSON, CSS) — текст в кодировке, указанной в charset.
Тело может отсутствовать:
- Для ответов без контента (204 No Content).
- Для ответов-перенаправлений (301, 302).
- Для HEAD-запроса (сервер возвращает только заголовки).
Как браузер обрабатывает ответ
Получив HTTP-ответ, браузер:
- Смотрит на код статуса. Если 3xx — переходит по новому адресу. Если 4xx/5xx — показывает ошибку. Если 2xx — обрабатывает.
- Читает
Content-Type. Еслиtext/html— начинает парсить HTML. Еслиimage/png— отображает картинку. - Сохраняет cookie из
Set-Cookie, если они есть. - Кэширует ответ согласно
Cache-Control, если разрешено. - Начинает рендеринг (для HTML) или передаёт данные соответствующему обработчику.
Полный пример
Запрос:
GET /api/user HTTP/1.1
Host: example.com
Accept: application/json
Ответ:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 85
Cache-Control: no-cache
{"id": 42, "name": "Stepan", "email": "stepan@example.com"}
Весь обмен занял одну TCP-сессию: соединение открыто, запрос отправлен, ответ получен.
Проверь себя
- Что означает код статуса 200?
- Зачем нужен заголовок
Content-Type? - Может ли HTTP-ответ быть без тела?
- 200 OK — запрос успешно обработан. Это самый распространённый успешный код.
- Без
Content-Typeклиент не знает, что за данные в теле ответа: HTML, JSON, картинка. Браузер не сможет корректно обработать ответ. - Да. Например: 204 No Content (запрос обработан, но данных нет), 304 Not Modified (используй кэш), ответы с перенаправлением (3xx).
Что унести с урока
- HTTP-ответ состоит из статусной строки, заголовков и тела.
- Код статуса (200, 404, 500) — первое, на что смотрит клиент.
Content-Typeговорит клиенту, как интерпретировать тело ответа.Set-Cookieустанавливает cookie,Cache-Controlуправляет кэшированием.- Тело может отсутствовать (204, 304, 3xx, HEAD-запросы).
Структура запроса и ответа ясна. В следующем уроке разберём HTTP-методы — GET, POST, PUT, DELETE, PATCH и как выбрать правильный.