Что такое HTTP-заголовки? Приведите примеры основных типов.

Ответ

HTTP-заголовки — это пары ключ: значение, которые передают метаданные о запросе или ответе между клиентом и сервером. Они позволяют управлять кэшированием, аутентификацией, передавать информацию о формате данных и многое другое.

Заголовки можно разделить на несколько основных групп:

  1. Request Headers (Заголовки запроса) — отправляются клиентом серверу.

    • Host: Доменное имя сервера, к которому направлен запрос.
    • User-Agent: Информация о клиенте (например, браузер, curl).
    • Accept: Типы контента, которые клиент может принять в ответе (например, application/json).
    • Authorization: Данные для аутентификации (например, Bearer <token>).
    • Content-Type: MIME-тип тела запроса (для POST, PUT).
  2. Response Headers (Заголовки ответа) — отправляются сервером клиенту.

    • Content-Type: MIME-тип тела ответа.
    • Content-Length: Размер тела ответа в байтах.
    • Set-Cookie: Установка cookie на стороне клиента.
    • Cache-Control: Инструкции по кэшированию ответа.
    • Location: Используется для перенаправления (редиректа) на другой URL.
  3. General Headers (Общие заголовки) — могут присутствовать как в запросах, так и в ответах.

    • Date: Дата и время формирования сообщения.
    • Connection: Управляет текущим соединением (например, keep-alive).

Пример создания запроса с заголовками в Go:

// Создаем новый GET-запрос
req, _ := http.NewRequest("GET", "https://api.example.com/items", nil)

// Добавляем заголовки
req.Header.Add("Authorization", "Bearer mysecrettoken")
req.Header.Add("Accept", "application/json")

// Отправляем запрос
client := &http.Client{}
resp, err := client.Do(req)

Ответ 18+ 🔞

Смотри, ну это ж элементарно, Ватсон! HTTP-заголовки — это как такие вот бумажки-напоминалки, которые клиент и сервер друг дружке суют в карман. Просто парочки ключ: значение. "Эй, сервак, вот тебе метаданные, разберись там!" — и наоборот. Через них кэшированием рулят, аутентификацию делают, про формат данных договариваются — да вообще овердохуища всего.

Делится эта радость на три кучки, чтоб не запутаться:

  1. Заголовки запроса (Request Headers) — это когда клиент серверу что-то нашептывает.

    • Host: Слушай сюда, мудак, на какой именно домен я стучусь, а? Вот это вот.
    • User-Agent: А это я, Петрович, из браузера Chrome! Или curl, если я сегодня злой.
    • Accept: Я, в принципе, готов принять application/json, но если уж совсем пиздец — text/html сойдёт.
    • Authorization: Держи мой токен, ёпта, Bearer <token>. Я свой, не бей.
    • Content-Type: А в теле запроса у меня лежит, например, application/x-www-form-urlencoded. Не обосрись.
  2. Заголовки ответа (Response Headers) — а это уже сервер отыгрывается.

    • Content-Type: На, получай свой application/json, жри.
    • Content-Length: И не ори, что мало, вот тебе размер в байтах.
    • Set-Cookie: Держи печеньку, запомни меня, сука, в следующий раз сразу пущу.
    • Cache-Control: И кэшируй это всё по таким-то правилам, а то забудешь — опять ко мне лезть будешь.
    • Location: А тут тебе не сидится, иди нахуй, вот новый адрес для редиректа.
  3. Общие заголовки (General Headers) — ну это которые и там, и сям могут болтаться.

    • Date: Сообщение написано тогда-то, если что.
    • Connection: Соединение не рви, keep-alive, будь человеком.

Ну и как это выглядит в коде на Go, чтобы не быть просто теоретическим пиздаболом:

// Делаем новый GET-запрос
req, _ := http.NewRequest("GET", "https://api.example.com/items", nil)

// Навешиваем на него заголовки, как медали на грудь
req.Header.Add("Authorization", "Bearer mysecrettoken")
req.Header.Add("Accept", "application/json")

// И пиздуем отправлять
client := &http.Client{}
resp, err := client.Do(req)

Вот и вся магия, блядь. Ничего сложного, обычная бюрократия интернета.