October 20, 2025

HTTP-запросы

🔹 HTTP-запросы: структура, методы, коды состояния

1️⃣ Базовые понятия HTTP

  • HTTP (HyperText Transfer Protocol) — протокол прикладного уровня для передачи гипертекста и доступа к ресурсам веба.
  • Участники:
    1. Клиент — запрашивает ресурс.
    2. Сервер — обрабатывает запрос и возвращает ресурс.
  • Порт по умолчанию: 80 (HTTP), 443 (HTTPS).
  • Спецификация: RFC 2616. Популярные версии: HTTP/1.1 и HTTP/2.

2️⃣ HTTP-сообщения

Типы:

  1. Запросы (Request) — от клиента к серверу для получения ресурса или выполнения действия.
  2. Ответы (Response) — от сервера клиенту, содержат результат обработки запроса.

Структура:

  1. Стартовая строка — метод, URL, версия протокола.
  2. HTTP-заголовки — метаданные запроса/ответа.
  3. Пустая строка — разделитель метаданных и тела.
  4. Тело сообщения (опционально) — данные запроса или документа.

3️⃣ Стартовая строка запроса

Состоит из:

  1. Метод (GET, POST, PUT, DELETE и др.)
  2. URL (Scheme, Host, Port, Path, Query String)
  3. Версия протокола (HTTP/1.1, HTTP/2)

Пример:

GET /index.html HTTP/1.1

4️⃣ Методы HTTP

  • GET — получить ресурс.
  • POST — отправить данные на сервер.
  • PUT — обновить ресурс.
  • DELETE — удалить ресурс.
  • HEAD, OPTIONS, PATCH — вспомогательные методы.

Примечание: Некоторые методы могут иметь тело запроса (POST, PUT), другие — нет (GET, DELETE).


5️⃣ URL-компоненты

  • Scheme — протокол (http://, https://)
  • Host — доменное имя или IP
  • Port — номер порта (по умолчанию для http 80, https 443)
  • Path — путь к ресурсу (например /index.html)
  • Query String — параметры запроса (?param=value&param2=value2)

Обязательные: Scheme + Host. Остальные опциональны.

7️⃣ HTTP-заголовки

Формат: Имя-Заголовок: Значение
Регистрозависимость: нет, но принято начинать каждое слово с заглавной буквы.

Категории:

  1. Общие — применяются ко всему сообщению.
  2. Запроса — уточняют информацию о запросе.
  3. Представления — указывают формат данных и кодировку, применяются с телом запроса.

8️⃣ Тело запроса

  • Обязательное только для методов, которые отправляют данные (POST, PUT).
  • Отсутствует у GET, DELETE, HEAD, OPTIONS.

9️⃣ HTTP-ответы

Структура: аналогична запросу — стартовая строка (status line), заголовки, тело.

Строка статуса

Содержит:

  1. Версию протокола
  2. Код состояния (HTTP status code)
  3. Текстовое пояснение к коду

Коды состояния

  • 1xx — информационные
  • 2xx — успех (200 OK, 201 Created)
  • 3xx — редирект
  • 4xx — ошибка клиента (400 Bad Request, 404 Not Found)
  • 5xx — ошибка сервера (500 Internal Server Error)

10️⃣ Заголовки ответа

  • Формат: Имя: Значение
  • Назначение: уточнение ответа, не влияет на тело.

11️⃣ Тело ответа

  • Необязательное.
  • Присутствует для большинства ответов (HTML, JSON, XML).
  • Отсутствует для 201 Created, 204 No Content.

12️⃣ Безопасность: HTTP vs HTTPS

  • HTTP — данные передаются в открытом виде.
  • HTTPS — данные шифруются, используется порт 443, защищает учетные данные пользователей.

13️⃣ Практика: как отправить HTTP-запрос

Инструменты:

  1. Инструменты разработчика в браузере (F12 / Ctrl+Shift+I)
    • Вкладка Network показывает все запросы, метод, URL и статус.
  2. cURL — командная утилита для отправки запросов:curl -v https://selectel.ru/blog

🔹 Идемпотентность в API

1️⃣ Определение

  • Идемпотентность — повторение действия не изменяет результат после первого выполнения.
  • Позволяет избежать дублирования и непредсказуемых результатов при сетевых сбоях.

2️⃣ Примеры

Пицца:

orders = {}

def place_order(order_id, pizza):
    if order_id in orders:
        return "Заказ уже существует."
    orders[order_id] = pizza
    return "Заказ успешно создан."

first_try = place_order("123", "Пепперони")
second_try = place_order("123", "Пепперони")
print(first_try)  # Заказ успешно создан.
print(second_try) # Заказ уже существует.
  • Повторный запрос не создаёт дубликат заказа.

3️⃣ Идемпотентные методы HTTP

  • GET — получение данных
  • PUT — обновление ресурса
  • DELETE — удаление ресурса
Любой повторный запрос не изменяет состояние сервера более одного раза.

4️⃣ Ключ идемпотентности

  • Уникальный идентификатор операции (например UUID).
  • Система распознает повторные запросы и не выполняет их снова.
  • Пример: перевод денег, где повторный запрос не создает двойной перевод.

5️⃣ Плюсы и минусы

Плюсы:

  • Надежность и стабильность системы
  • Предсказуемость действий
  • Упрощение разработки и тестирования

Минусы:

  • Требует дополнительного проектирования
  • Может ограничивать некоторые сценарии бизнес-логики

6️⃣ Вывод

  • HTTP — расширяемый протокол прикладного уровня для веба.
  • HTTPS обеспечивает безопасную передачу данных.
  • Идемпотентность — ключ к надежности API и предотвращению дублирования действий.


Еще посмотри тут:

https://youtu.be/OyfroULbRN4?si=u1IhOAgFGL1f66G5


и почитать тут https://habr.com/ru/articles/739166/