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

Что представляет собой HTTP и на какие основные компоненты оно делится?

2.0 Middle🔥 191 комментариев
#REST API и HTTP

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

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

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

HTTP: протокол обмена данными в интернете

HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня (Layer 7 в OSI модели), который определяет как клиент (браузер, приложение) и сервер обмениваются данными в интернете. За 10+ лет разработки я использую HTTP каждый день, и понимание его деталей критично для создания масштабируемых приложений.

Основная идея HTTP

Клиент (браузер)         Интернет          Сервер
     |                      |                 |
     |--- REQUEST HTTP ----> |                 |
     |    (GET /api/users)   |                 |
     |                       |--- маршрутизация --->
     |                       |                 |--- обработка
     |<--- RESPONSE HTTP --- |<-- возврат данных
     | (200 OK + JSON)       |                 |

Это request-response модель:

  1. Клиент отправляет запрос (request)
  2. Сервер обрабатывает
  3. Сервер отправляет ответ (response)

Основные компоненты HTTP

1. HTTP Request (Запрос)

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

GET /api/users?page=1 HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Authorization: Bearer token123

{"name": "John", "email": "john@example.com"}

Составные части:

A. Request Line (Строка запроса)

GET /api/users?page=1 HTTP/1.1
  • HTTP Method: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
  • URL path + query string: /api/users?page=1
  • HTTP версия: HTTP/1.1 или HTTP/2

HTTP Methods:

# GET — получить данные
GET /api/users

# POST — создать новый ресурс
POST /api/users
{"name": "John"}

# PUT — заменить весь ресурс
PUT /api/users/123
{"name": "Jane", "email": "jane@example.com"}

# PATCH — частичное обновление
PATCH /api/users/123
{"name": "Jane"}

# DELETE — удалить ресурс
DELETE /api/users/123

# HEAD — как GET, но без тела ответа
HEAD /api/users

# OPTIONS — получить методы, которые поддерживает сервер
OPTIONS /api/users

B. Headers (Заголовки)

Host: api.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Content-Type: application/json
Content-Length: 47
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Request-ID: abc-123-def

Основные заголовки:

# Информирует сервер, какой тип данных клиент отправляет
Content-Type: application/json
Content-Type: text/html; charset=utf-8

# Размер тела запроса в байтах
Content-Length: 256

# Какой тип данных клиент может принять
Accept: application/json
Accept: text/html, application/json

# Автентификация
Authorization: Bearer <token>
Authorization: Basic username:password

# Информация о клиенте
User-Agent: Mozilla/5.0 (платформа)

# Хост сервера
Host: api.example.com

# Контроль кэширования
Cache-Control: max-age=3600

# Тип подключения
Connection: keep-alive

# CORS заголовки
Origin: https://example.com

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

Опционально. Обычно в POST, PUT, PATCH:

{
  "name": "John Doe",
  "email": "john@example.com",
  "age": 30
}

Это может быть:

  • JSON (application/json)
  • Form data (application/x-www-form-urlencoded)
  • XML (application/xml)
  • Multipart для файлов (multipart/form-data)

2. HTTP Response (Ответ)

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

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600
Set-Cookie: session=abc123; Path=/

{
  "id": 1,
  "name": "John",
  "email": "john@example.com"
}

Составные части:

A. Status Line (Строка статуса)

HTTP/1.1 200 OK
  • HTTP версия: HTTP/1.1
  • Status Code: числовой код ответа
  • Status Message: текстовое описание

Основные коды:

# 2xx — Успех
200 OK                # Успешный запрос
201 Created           # Ресурс создан
204 No Content        # Успех, но нет тела ответа

# 3xx — Редирект
301 Moved Permanently # Ресурс перемещён навсегда
302 Found             # Временное перемещение
304 Not Modified      # Кэш актуален, не отправляем тело

# 4xx — Ошибка клиента
400 Bad Request       # Неправильный запрос
401 Unauthorized      # Нужна авторизация
403 Forbidden         # Доступ запрещён
404 Not Found         # Ресурс не найден
429 Too Many Requests # Rate limit

# 5xx — Ошибка сервера
500 Internal Server Error  # Ошибка на сервере
503 Service Unavailable    # Сервис недоступен

B. Response Headers (Заголовки ответа)

Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600, public
Set-Cookie: session=xyz789; Path=/; HttpOnly; Secure
Access-Control-Allow-Origin: *
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
Vary: Accept-Encoding

Основные заголовки:

# Тип содержимого
Content-Type: application/json

# Размер тела
Content-Length: 256

# Кэширование
Cache-Control: max-age=3600  # Кэшировать на 1 час
ETag: "hash"                 # Версия ресурса для кэша
Last-Modified: <date>        # Последнее изменение

# Cookies
Set-Cookie: session=abc; Path=/; HttpOnly; Secure

# CORS
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type

# Сжатие
Content-Encoding: gzip

# Безопасность
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

C. Body (Тело ответа)

Данные, которые сервер возвращает:

{
  "id": 1,
  "name": "John",
  "email": "john@example.com",
  "created_at": "2025-03-23T10:30:00Z"
}

3. URL (Uniform Resource Locator)

https://api.example.com:443/api/v1/users/123?page=1&limit=10#section
├─ scheme    = https (https, http, ftp)
├─ host      = api.example.com
├─ port      = 443 (необязательно, по умолчанию 80 для http, 443 для https)
├─ path      = /api/v1/users/123
├─ query     = page=1&limit=10 (параметры поиска)
└─ fragment  = section (якорь, не отправляется на сервер)

4. Cookies (Куки)

Как работают:

1. Сервер отправляет: Set-Cookie: session=abc123
2. Браузер сохраняет куку
3. При следующем запросе браузер отправляет: Cookie: session=abc123
4. Сервер проверяет куку и знает, это тот же пользователь
# Отправка куки
response.set_cookie(
    'session',
    'abc123',
    max_age=3600,        # LifeTime: 1 час
    path='/',
    secure=True,         # Только через HTTPS
    httponly=True,       # Недоступна JavaScript (защита от XSS)
    samesite='Strict'    # Защита от CSRF
)

# Удаление куки
response.delete_cookie('session')

5. HTTPS (Безопасный HTTP)

HTTP  → данные в открытом виде (небезопасно)
HTTPS → HTTP + TLS/SSL шифрование (безопасно)

HTTPS использует:
- SSL/TLS для шифрования
- Сертификаты для проверки подлинности сервера
- Защиту от MITM (man-in-the-middle) атак

6. HTTP версии

# HTTP/1.1 (давно, всё ещё используется)
# - Один запрос-ответ за раз
# - TCP подключение переиспользуется
# - Head-of-line blocking проблема

# HTTP/2 (современный, быстрее)
# - Множество запросов одновременно (multiplexing)
# - Бинарный протокол (компактнее)
# - Server push (сервер отправляет данные без запроса)

# HTTP/3 (самый новый, на базе QUIC)
# - Ещё быстрее благодаря UDP
# - Лучше работает при потере пакетов

7. REST API пример

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    email: str

# GET — получить
@app.get("/users")
def get_users():
    # HTTP Request:
    # GET /users HTTP/1.1
    # Host: api.example.com
    #
    # HTTP Response:
    # HTTP/1.1 200 OK
    # Content-Type: application/json
    # [{"id": 1, "name": "John"}]
    return [{"id": 1, "name": "John"}]

# POST — создать
@app.post("/users")
def create_user(user: User):
    # HTTP Request:
    # POST /users HTTP/1.1
    # Content-Type: application/json
    # {"name": "Jane", "email": "jane@example.com"}
    #
    # HTTP Response:
    # HTTP/1.1 201 Created
    # {"id": 2, "name": "Jane", "email": "jane@example.com"}
    return {"id": 2, **user.dict()}

# PUT — обновить
@app.put("/users/{user_id}")
def update_user(user_id: int, user: User):
    # HTTP Response: 200 OK
    return {"id": user_id, **user.dict()}

# DELETE — удалить
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
    # HTTP Response: 204 No Content
    return None

8. Важные HTTP концепции

Stateless (Без состояния)

Каждый запрос независим.
Сервер не хранит информацию о клиенте между запросами.
→ Использую куки или токены для отслеживания сессии

Idempotent (Идемпотентность)

# GET, PUT, DELETE — идемпотентны
# Повторный запрос = тот же результат

GET /users/1    # 1-й запрос → User(id=1, name="John")
GET /users/1    # 2-й запрос → User(id=1, name="John")

DELETE /users/1  # Удаляет пользователя
DELETE /users/1  # Пользователя уже нет, но ответ всё равно 204

# POST — НЕ идемпотентен
POST /users  # Создаёт новый User (id=1)
POST /users  # Создаёт новый User (id=2)

Content Negotiation (Согласование типа данных)

# Клиент может просить разные форматы
Accept: application/json      # Хочу JSON
Accept: application/xml       # Хочу XML
Accept: text/html            # Хочу HTML

# Сервер отвечает
Content-Type: application/json

Заключение

HTTP — это основной протокол веб-разработки, состоящий из:

  1. Request (запрос от клиента): Method + URL + Headers + Body
  2. Response (ответ от сервера): Status Code + Headers + Body
  3. URLs для адресации ресурсов
  4. HTTP Methods (GET, POST, PUT, DELETE, PATCH)
  5. Status Codes (2xx, 3xx, 4xx, 5xx)
  6. Headers для метаданных
  7. Cookies для состояния
  8. HTTPS для безопасности

Понимание этих компонентов критично для разработки надёжных и безопасных веб-приложений.