Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
HTTP протокол: структура
HTTP (HyperText Transfer Protocol) — это протокол уровня приложения для передачи данных по сети. Он основан на модели "запрос-ответ".
Основные компоненты HTTP
1. Request (Запрос)
Клиент (обычно браузер) отправляет серверу запрос:
GET /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer token123
Accept: application/json
User-Agent: Mozilla/5.0
{"filter": "active"}
Состав запроса:
-
Request Line (строка запроса):
- HTTP Method: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
- Request URL: /api/users/123
- HTTP Version: HTTP/1.1, HTTP/2, HTTP/3
-
Headers (заголовки):
- Host: адрес сервера
- Content-Type: тип данных (application/json, text/html, multipart/form-data)
- Content-Length: размер тела
- Authorization: аутентификация
- Accept: какие типы ответов принимаем
- User-Agent: клиент (браузер, бот)
- Cookie: сохранённые данные
- Custom headers: X-Request-ID, X-Api-Key и т.д.
-
Empty Line (пустая строка) — разделитель
-
Body (тело запроса) — опционально
- JSON, XML, form data, бинарные данные
- Только для POST, PUT, PATCH
2. Response (Ответ)
Сервер отправляет ответ:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 245
Set-Cookie: session_id=abc123; Path=/
Access-Control-Allow-Origin: *
{
"id": 123,
"name": "John Doe",
"email": "john@example.com"
}
Состав ответа:
-
Status Line (строка статуса):
- HTTP Version: HTTP/1.1
- Status Code: 200, 404, 500, 201 и т.д.
- Status Message: OK, Not Found, Internal Server Error
-
Headers (заголовки):
- Content-Type: тип данных в теле
- Content-Length: размер тела
- Cache-Control: как кешировать
- ETag: идентификатор версии
- Set-Cookie: установить cookie
- Access-Control-Allow-*: CORS headers
- Location: для редиректов
- Server: информация о сервере
-
Empty Line — разделитель
-
Body — ответные данные
HTTP Methods (Методы)
GET — получить ресурс (безопасный, идемпотентный)
POST — создать ресурс (НЕ идемпотентный)
PUT — заменить весь ресурс (идемпотентный)
PATCH — частичное обновление (НЕ идемпотентный)
DELETE — удалить ресурс (идемпотентный)
HEAD — как GET, но без тела (получить метаданные)
OPTIONS — получить доступные методы (CORS preflight)
HTTP Status Codes (Коды статуса)
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 — слишком много запросов
5xx — Ошибка сервера
- 500 Internal Server Error — внутренняя ошибка
- 502 Bad Gateway — некорректный ответ от upstream
- 503 Service Unavailable — сервис недоступен
Пример на Python (Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/users/<int:user_id>", methods=["GET", "PUT", "DELETE"])
def user_handler(user_id):
# Получить метод запроса
if request.method == "GET":
# Получить headers
auth = request.headers.get("Authorization")
# Получить query parameters
filter_by = request.args.get("filter")
# Составить ответ
return jsonify({"id": user_id, "name": "John"}), 200
elif request.method == "PUT":
# Получить JSON тело
data = request.get_json()
# Обновить пользователя
return jsonify({"id": user_id, "name": data["name"]}), 200
elif request.method == "DELETE":
# Удалить пользователя
return "", 204 # No Content
@app.errorhandler(404)
def not_found(error):
return jsonify({"error": "Not Found"}), 404
if __name__ == "__main__":
app.run()
HTTP/2 и HTTP/3
HTTP/1.1 (1997):
- Текстовый протокол
- Одно соединение на запрос
- Медленнее
HTTP/2 (2015):
- Бинарный протокол
- Multiplexing (несколько запросов по одному соединению)
- Сжатие headers
- Push (сервер может отправить данные без запроса)
HTTP/3 (2022):
- Использует QUIC (UDP вместо TCP)
- Ещё быстрее
- Лучше на мобильных сетях
Connection Types
HTTP — незащищённое соединение (порт 80)
HTTPS — защищённое (TLS/SSL, порт 443)
Жизненный цикл HTTP запроса
- Клиент инициирует соединение с сервером
- Отправляет Request (method, URL, headers, body)
- Сервер обрабатывает запрос
- Отправляет Response (status, headers, body)
- Соединение закрывается (или переиспользуется)
Важные концепции
Stateless — HTTP не сохраняет состояние между запросами. Для сохранения состояния используются cookies или tokens.
Idempotent — запрос можно повторить безопасно без побочных эффектов (GET, PUT, DELETE, но НЕ POST)
Вывод: HTTP — это основной протокол web, базируется на запрос-ответ модели с методами, headers и body. Версия 1.1 остаётся самой распространённой, но HTTP/2 и HTTP/3 набирают популярность.