Поддерживает ли архитектурный стиль REST кэширование

Ответ

Да, и это одна из ключевых особенностей (constraints) REST. Кэширование в REST полностью построено на возможностях протокола HTTP, на котором базируется большинство RESTful API.

REST не изобретает свои механизмы кэширования, а использует стандартные HTTP-заголовки. Это позволяет использовать существующую инфраструктуру (браузеры, прокси-серверы, CDN) для эффективного кэширования.

Основные HTTP-заголовки для кэширования:

  • Cache-Control: Основной заголовок, управляющий поведением кэша. Директивы включают:

    • max-age=3600: Время жизни кэша в секундах.
    • public / private: Разрешает кэширование общим (прокси) или только клиентским кэшем.
    • no-cache: Требует валидации с сервером перед использованием кэшированной версии.
    • no-store: Полностью запрещает кэширование.
  • ETag: Уникальный идентификатор версии ресурса (обычно хэш). Клиент отправляет его в заголовке If-None-Match. Если ETag на сервере совпадает, сервер возвращает 304 Not Modified без тела ответа, экономя трафик.

  • Last-Modified: Дата последнего изменения ресурса. Работает аналогично ETag, но с заголовком If-Modified-Since.

Пример ответа сервера на Flask:

from flask import Flask, jsonify, make_response

app = Flask(__name__)

@app.route('/data')
def get_data():
    data = {"id": 1, "content": "some important data"}
    response = make_response(jsonify(data))

    # Устанавливаем заголовки для кэширования на 1 минуту
    response.headers['Cache-Control'] = 'public, max-age=60'
    # Устанавливаем ETag на основе хэша данных
    response.headers['ETag'] = str(hash(str(data)))

    return response