Из чего состоит HTTP-запрос?

Ответ

HTTP-запрос — это текстовое сообщение, которое клиент (например, браузер) отправляет серверу. Он имеет четкую структуру и состоит из следующих частей:

  1. Стартовая строка (Request Line) Содержит три элемента, разделенных пробелами:

    • Метод (Method): Тип запроса (GET, POST, PUT, DELETE и т.д.).
    • URI (Uniform Resource Identifier): Путь к запрашиваемому ресурсу (например, /users/123).
    • Версия HTTP: Версия протокола (например, HTTP/1.1 или HTTP/2). Пример: GET /api/search?q=golang HTTP/1.1
  2. Заголовки (Headers) Строки в формате ключ: значение, которые передают метаинформацию о запросе. Примеры популярных заголовков:

    • Host: доменное имя сервера.
    • Content-Type: MIME-тип тела запроса (например, application/json).
    • Authorization: данные для аутентификации (например, Bearer <token>).
    • User-Agent: информация о клиенте.
  3. Пустая строка-разделитель Одна пустая строка (CRLF), которая является обязательным разделителем между заголовками и телом запроса.

  4. Тело запроса (Body) Необязательная часть, содержащая данные, которые отправляются на сервер. Обычно используется с методами POST, PUT, PATCH. Пример тела в формате JSON:

    {"username": "alex", "score": 100}

В Go для создания HTTP-запроса используется пакет net/http:

import (
    "net/http",
    "strings"
)

// Создаем тело запроса
requestBody := strings.NewReader(`{"name": "John Doe"}`)

// Формируем запрос
req, err := http.NewRequest("POST", "https://example.com/api/users", requestBody)
if err != nil {
    // обработка ошибки
}

// Добавляем заголовки
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer my-secret-token")

// Далее запрос можно выполнить с помощью http.Client
// client := &http.Client{}
// resp, err := client.Do(req)