Какова структура HTTP-запроса?

Ответ

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

  1. Стартовая (запросная) строка (Request Line)

    Содержит три элемента, разделенных пробелами:

    • Метод (Method): GET, POST, PUT, DELETE и др. Определяет действие, которое нужно выполнить.
    • URI (Uniform Resource Identifier): Путь к ресурсу на сервере, например /users/123.
    • Версия HTTP: Обычно HTTP/1.1 или HTTP/2.

      Пример: GET /api/v1/articles?page=2 HTTP/1.1
  2. Заголовки (Headers)

    Пары ключ: значение, которые передают дополнительную информацию о запросе. Каждый заголовок находится на новой строке.

    • Host: Обязательный заголовок, указывающий домен сервера.
    • Content-Type: Тип данных в теле запроса (например, application/json).
    • Authorization: Данные для аутентификации (например, Bearer <token>).
    • User-Agent: Информация о клиенте, отправившем запрос.

  3. Тело запроса (Body)

    Опциональная часть, содержащая данные, которые отправляются на сервер. Используется в основном с методами POST, PUT, PATCH для отправки данных (например, в формате JSON или как данные формы).


Пример создания HTTP-запроса в Go:

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

// Данные для тела запроса
jsonData := `{"name":"Alice", "age":30}`

// Создаем новый POST-запрос
// strings.NewReader создает io.Reader, который необходим для тела запроса
req, err := http.NewRequest("POST", "https://example.com/api/users", strings.NewReader(jsonData))
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)