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

Какой HTTP запрос можно кэшировать?

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

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

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

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

Кэширование HTTP запросов

В основном кэшируются безопасные и идемпотентные GET запросы, так как они не изменяют состояние на сервере. Однако правила кэширования более сложные и зависят от заголовков Cache-Control, ETag, Last-Modified и других механизмов.

Какие запросы кэшируются по умолчанию

По спецификации HTTP (RFC 7231):

  • GET запросы — кэшируются по умолчанию (если нет заголовков, запрещающих кэширование)
  • HEAD запросы — как и GET, так как они идентичны, только без тела ответа
  • POST/PUT/DELETEНЕ кэшируются по умолчанию (они изменяют состояние)

Управление кэшированием через Cache-Control

Заголовок Cache-Control управляет поведением кэширования:

from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/data")
def get_data(response: Response):
    response.headers["Cache-Control"] = "public, max-age=3600"
    return {"data": "cacheable"}

@app.get("/user")
def get_user(response: Response):
    response.headers["Cache-Control"] = "private, max-age=1800"
    return {"user": "John"}

Директивы Cache-Control

  • max-age=N — кэшировать N секунд
  • public — любой кэш может сохранить
  • private — только браузер может кэшировать
  • no-cache — проверить на сервере перед использованием
  • no-store — не сохранять вообще
  • must-revalidate — после истечения max-age переvalidate на сервере

ETag для условного кэширования

from fastapi import FastAPI, Response, status
import hashlib

app = FastAPI()

data = {"content": "Hello World"}
data_hash = hashlib.md5(str(data).encode()).hexdigest()

@app.get("/resource")
def get_resource(request, response: Response):
    response.headers["ETag"] = f"\"{data_hash}\""
    response.headers["Cache-Control"] = "max-age=0, must-revalidate"
    
    if request.headers.get("If-None-Match") == f"\"{data_hash}\"":
        response.status_code = status.HTTP_304_NOT_MODIFIED
        return
    
    return data

Что кэшируется в практике

Кэшируется:

  • GET запросы к статическим ресурсам
  • GET запросы к API с редко меняющимися данными
  • Ответы с 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501

НЕ кэшируется:

  • POST, PUT, DELETE, PATCH
  • Запросы с Authorization заголовком
  • Ответы с Set-Cookie

Корректное использование кэширования существенно снижает нагрузку на сервер и улучшает скорость приложения.