← Назад к вопросам

Как устроен протокол HTTP?

1.0 Junior🔥 231 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Протокол HTTP: полный разбор

HTTP (HyperText Transfer Protocol) — это прикладной протокол для передачи данных в интернете. Работает поверх TCP/IP и является фундаментом веб-приложений.

Модель запрос-ответ

HTTP работает по принципу клиент-сервер:

  1. Клиент инициирует соединение на порт 80 (HTTP) или 443 (HTTPS)
  2. Отправляет запрос с методом, URL и заголовками
  3. Сервер обрабатывает и отправляет ответ со статусом и данными
  4. Соединение закрывается (в HTTP/1.1 может переиспользоваться)

Структура HTTP запроса

GET /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer token123

{"filter": "active"}

Строка запроса: METHOD URL HTTP/VERSION

  • METHOD — GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
  • URL — путь и параметры запроса
  • HTTP/VERSION — версия протокола

Заголовки — пары ключ-значение для метаинформации

Тело (body) — опционально, данные для POST/PUT/PATCH

Структура HTTP ответа

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
Set-Cookie: session=abc123

{"id": 123, "name": "John", "active": true}

Статусная строка: HTTP/VERSION CODE MESSAGE

Коды статуса:

  • 1xx — Информационные (100 Continue)
  • 2xx — Успех (200 OK, 201 Created, 204 No Content)
  • 3xx — Редирект (301 Moved, 304 Not Modified)
  • 4xx — Ошибка клиента (400 Bad Request, 401 Unauthorized, 404 Not Found)
  • 5xx — Ошибка сервера (500 Internal, 503 Service Unavailable)

HTTP методы

МетодЦельТелоКэшируется
GETПолучить ресурсНетДа
POSTСоздать ресурсДаНет
PUTПолное обновлениеДаНет
PATCHЧастичное обновлениеДаНет
DELETEУдалить ресурсНетНет
HEADGET без телаНетДа
OPTIONSПолучить методыНетДа

Версии HTTP

HTTP/1.1 (1997)

  • Persistent connections (Keep-Alive)
  • Pipelining (отправка нескольких запросов подряд)
  • Проблема: head-of-line blocking

HTTP/2 (2015)

  • Мультиплексирование (параллельные потоки в одном соединении)
  • Сжатие заголовков (HPACK)
  • Push Server (сервер может отправлять данные без запроса)
  • Требует HTTPS

HTTP/3 (2022)

  • Поверх QUIC (UDP вместо TCP)
  • Быстрее подключение
  • Лучше на медленных сетях

Безопасность: HTTPS

HTTPS = HTTP + TLS/SSL шифрование

import requests

# Автоматически использует HTTPS
response = requests.get("https://api.example.com/users")

# Проверка сертификата (по умолчанию включена)
response = requests.get(
    "https://api.example.com/users",
    verify=True  # Проверяет SSL сертификат
)

Состояние: cookies и сессии

HTTP — stateless протокол. Для отслеживания состояния используют:

import requests

# Сессия сохраняет cookies между запросами
session = requests.Session()
session.post("https://api.example.com/login", json={"user": "john"})
response = session.get("https://api.example.com/profile")  # Имеет cookie

# Или вручную
response = requests.get(
    "https://api.example.com/profile",
    cookies={"session_id": "abc123"}
)

Кэширование

# Заголовки кэширования
Cache-Control: max-age=3600  # Кэш на 1 час
ETag: "33a64df5425f"  # Версия ресурса
Last-Modified: Wed, 22 Mar 2023 12:00:00 GMT

# При повторном запросе клиент отправляет:
If-None-Match: "33a64df5425f"
# Сервер отвечает 304 Not Modified (без передачи данных)

Практический пример с Python

import requests

# Простой запрос
response = requests.get("https://api.github.com/users/octocat")
print(response.status_code)  # 200
print(response.json())        # Распарсенный JSON

# Запрос с параметрами
response = requests.get(
    "https://api.github.com/search/repositories",
    params={"q": "language:python", "sort": "stars"}
)

# POST с данными
response = requests.post(
    "https://api.example.com/users",
    json={"name": "John", "email": "john@example.com"},
    headers={"Authorization": "Bearer token123"}
)

# Обработка ошибок
try:
    response = requests.get("https://api.example.com/users/999")
    response.raise_for_status()  # Выбросит HTTPError на 4xx/5xx
except requests.exceptions.HTTPError as e:
    print(f"HTTP ошибка: {e}")

HTTP — простой, но мощный протокол, который доминирует в веб-разработке благодаря масштабируемости и универсальности.