Структура 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-ответ, браузер:

  1. Смотрит на код статуса. Если 3xx — переходит по новому адресу. Если 4xx/5xx — показывает ошибку. Если 2xx — обрабатывает.
  2. Читает Content-Type. Если text/html — начинает парсить HTML. Если image/png — отображает картинку.
  3. Сохраняет cookie из Set-Cookie, если они есть.
  4. Кэширует ответ согласно Cache-Control, если разрешено.
  5. Начинает рендеринг (для 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-сессию: соединение открыто, запрос отправлен, ответ получен.

Проверь себя

  1. Что означает код статуса 200?
  2. Зачем нужен заголовок Content-Type?
  3. Может ли HTTP-ответ быть без тела?
<details> <summary>Ответы</summary>
  1. 200 OK — запрос успешно обработан. Это самый распространённый успешный код.
  2. Без Content-Type клиент не знает, что за данные в теле ответа: HTML, JSON, картинка. Браузер не сможет корректно обработать ответ.
  3. Да. Например: 204 No Content (запрос обработан, но данных нет), 304 Not Modified (используй кэш), ответы с перенаправлением (3xx).
</details>

Что унести с урока

  • HTTP-ответ состоит из статусной строки, заголовков и тела.
  • Код статуса (200, 404, 500) — первое, на что смотрит клиент.
  • Content-Type говорит клиенту, как интерпретировать тело ответа.
  • Set-Cookie устанавливает cookie, Cache-Control управляет кэшированием.
  • Тело может отсутствовать (204, 304, 3xx, HEAD-запросы).

Структура запроса и ответа ясна. В следующем уроке разберём HTTP-методы — GET, POST, PUT, DELETE, PATCH и как выбрать правильный.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике