← Назад к вопросам
Что представляет собой 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 модель:
- Клиент отправляет запрос (request)
- Сервер обрабатывает
- Сервер отправляет ответ (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 — это основной протокол веб-разработки, состоящий из:
- Request (запрос от клиента): Method + URL + Headers + Body
- Response (ответ от сервера): Status Code + Headers + Body
- URLs для адресации ресурсов
- HTTP Methods (GET, POST, PUT, DELETE, PATCH)
- Status Codes (2xx, 3xx, 4xx, 5xx)
- Headers для метаданных
- Cookies для состояния
- HTTPS для безопасности
Понимание этих компонентов критично для разработки надёжных и безопасных веб-приложений.