Какие основные категории заголовков HTTP-запроса вы знаете?

Ответ

Заголовки HTTP-запроса делятся на четыре основные категории, каждая со своей специфической ролью.

1. Общие заголовки (General Headers) Применяются как к запросам, так и к ответам.

  • Cache-Control: Управляет кэшированием.
  • Connection: Определяет параметры управления соединением.
  • Date: Дата и время создания сообщения.

2. Заголовки запроса (Request Headers) Определяют параметры запрашиваемого ресурса или самого клиента.

  • Accept: Указывает типы контента, которые клиент может обработать (например, application/json).
  • Authorization: Содержит учетные данные для аутентификации (например, Bearer <token>).
  • User-Agent: Идентифицирует клиентское приложение.
  • Host: Обязательный заголовок, указывает доменное имя и порт сервера.

3. Заголовки ответа (Response Headers) Содержат дополнительную информацию об ответе сервера.

  • Server: Информация о ПО сервера.
  • Set-Cookie: Отправляет cookie от сервера клиенту.
  • Access-Control-Allow-Origin: Используется в CORS для указания разрешенных источников.

4. Заголовки представления (Representation Headers) Описывают формат и свойства тела сообщения (ранее «Заголовки сущности»).

  • Content-Type: Указывает медиа-тип тела (например, application/json; charset=utf-8).
  • Content-Length: Размер тела сообщения в байтах.
  • Content-Encoding: Используемое сжатие (например, gzip).

Пример HTTP-запроса с заголовками:

GET /api/data HTTP/1.1
Host: api.example.com
User-Agent: MyApp/1.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Cache-Control: no-cache

Ответ 18+ 🔞

Давай разберём эту всю хуйню с заголовками, а то читаешь спецификацию — глаза на лоб лезут, как будто Толстой про Муму писал, блядь. Но тут всё проще, если по-человечьи.

В общем, смотри. Все эти заголовки в HTTP — они как паспорт, характер и инструкция в одном флаконе. Делится этот цирк на четыре главных отряда, чтобы не путаться.

1. Общие заголовки (General Headers) Это как погода на улице — касается и запроса, и ответа. Универсальная хуйня.

  • Cache-Control: Тут решаем, кэшировать ли нам эту хрень или нет. Типа «запомни надолго» или «забудь сразу, нахуй».
  • Connection: Обсуждаем, будем ли мы держаться за руки после запроса или разбежимся как тараканы.
  • Date: Просто ставим штамп, когда это письмо написали. Чтобы потом не спорить, кто первый начал.

2. Заголовки запроса (Request Headers) А вот это уже наш с тобой разговор с сервером. Мы ему рассказываем, кто мы и чего хотим.

  • Accept: Говорим серверу: «Слушай, дружок, я понимаю только JSON (или HTML, или картинки). Не неси мне какую-нибудь дичь вроде XML, я её сожру, но обосрусь».
  • Authorization: Тут мы предъявляем пропуск. Типа «гляди, у меня токен есть, Bearer eyJ... — вот эта абракадабра. Пускай, сука!».
  • User-Agent: Скромно представляемся: «Я — браузер Хром, версии такой-то» или «Я — твоё кривое мобильное приложение, извини».
  • Host: Это ОБЯЗАТЕЛЬНО, ёпта! Кричим серверу: «Эй, ты! Я стучусь к api.example.com! Не путай меня с другими дверями!».

3. Заголовки ответа (Response Headers) А это сервер нам отвечает, такой весь из себя важный.

  • Server: Скромно хвастается: «А я, между прочим, nginx/1.8.0!». Ну спасибо, просветил, блядь.
  • Set-Cookie: Суёт нам печеньку прямо в руки. «На, сожри, и запомни меня в следующий раз, чтоб я тебя узнал».
  • Access-Control-Allow-Origin: Это уже политика, блядь. Говорит: «Я тебе, с такого-то домена, отвечать буду. А вот этому пидарасу с левого адреса — ни хуя!». CORS, ёпта.

4. Заголовки представления (Representation Headers) Раньше назывались «заголовки сущности», но переименовали, видимо, чтобы мозг выебать окончательно. Описывают, ЧТО именно нам прислали в теле.

  • Content-Type: Самое важное! «Держи, это application/json, и кодировка utf-8. Читай как есть». А мог бы быть и text/html, и тогда совсем другая история.
  • Content-Length: Чётко говорит: «Тело сообщения весит ровно 2048 байтов. Не жди больше, не проси меньше».
  • Content-Encoding: «Я эту хрень ещё и сжал, gzip'ом. Распакуй сначала, потом читай, ленивая жопа».

Ну и как это всё выглядит вживую, внатуре:

GET /api/data HTTP/1.1
Host: api.example.com
User-Agent: MyApp/1.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Cache-Control: no-cache

Вот и весь сказ. Клиент пришёл, представился, сказал, чего хочет, показал пропуск и попросил ничего не кэшировать. Ждём ответа. А там уже сервер начнёт своё: «Я nginx, держи JSON, вот тебе печенька, и вали отсюда». Красота, блядь!