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

Из чего состоит http протокол

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

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

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

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

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"}

Состав запроса:

  1. 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
  2. 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 и т.д.
  3. Empty Line (пустая строка) — разделитель

  4. 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"
}

Состав ответа:

  1. Status Line (строка статуса):

    • HTTP Version: HTTP/1.1
    • Status Code: 200, 404, 500, 201 и т.д.
    • Status Message: OK, Not Found, Internal Server Error
  2. Headers (заголовки):

    • Content-Type: тип данных в теле
    • Content-Length: размер тела
    • Cache-Control: как кешировать
    • ETag: идентификатор версии
    • Set-Cookie: установить cookie
    • Access-Control-Allow-*: CORS headers
    • Location: для редиректов
    • Server: информация о сервере
  3. Empty Line — разделитель

  4. 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 запроса

  1. Клиент инициирует соединение с сервером
  2. Отправляет Request (method, URL, headers, body)
  3. Сервер обрабатывает запрос
  4. Отправляет Response (status, headers, body)
  5. Соединение закрывается (или переиспользуется)

Важные концепции

Stateless — HTTP не сохраняет состояние между запросами. Для сохранения состояния используются cookies или tokens.

Idempotent — запрос можно повторить безопасно без побочных эффектов (GET, PUT, DELETE, но НЕ POST)

Вывод: HTTP — это основной протокол web, базируется на запрос-ответ модели с методами, headers и body. Версия 1.1 остаётся самой распространённой, но HTTP/2 и HTTP/3 набирают популярность.

Из чего состоит http протокол | PrepBro