Каковы основные принципы и ограничения REST архитектуры

«Каковы основные принципы и ограничения REST архитектуры» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST (Representational State Transfer) — это архитектурный стиль для создания распределенных систем, основанный на наборе принципов (ограничений), которые определяют, как взаимодействуют компоненты системы.

Ключевые принципы REST:

  1. Клиент-серверная модель (Client-Server) Разделение ответственности: клиент отвечает за пользовательский интерфейс, а сервер — за хранение и обработку данных. Это позволяет им развиваться независимо.

  2. Отсутствие состояния (Stateless) Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его выполнения. Сервер не хранит состояние клиента между запросами. Это повышает надежность, видимость и масштабируемость системы.

  3. Кэширование (Cacheable) Ответы сервера должны явно помечаться как кэшируемые или некэшируемые. Это позволяет клиентам и промежуточным узлам (например, CDN) сохранять копии ответов для улучшения производительности.

  4. Единообразие интерфейса (Uniform Interface) Это фундаментальный принцип, который упрощает и стандартизирует архитектуру. Он включает в себя:

    • Идентификация ресурсов: Ресурсы (например, /users/123) однозначно идентифицируются с помощью URI.
    • Манипуляция ресурсами через представления: Клиент взаимодействует с представлением ресурса (например, JSON), а не с самим ресурсом.
    • Использование стандартных HTTP-методов: GET (получение), POST (создание), PUT (полное обновление), PATCH (частичное обновление), DELETE (удаление).
  5. Многоуровневая система (Layered System) Клиент не может напрямую определить, подключен ли он к конечному серверу или к промежуточному узлу (прокси, балансировщик нагрузки). Это позволяет добавлять слои для масштабирования, безопасности и кэширования.

Пример реализации эндпоинта на FastAPI:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

# Модель ресурса
class User(BaseModel):
    id: int
    name: str

# "База данных" в памяти
db = {1: User(id=1, name="Alice")}

# Получение ресурса по URI с использованием GET
@app.get("/users/{user_id}", response_model=User)
def get_user(user_id: int):
    user = db.get(user_id)
    if not user:
        # Использование стандартных кодов состояния HTTP
        raise HTTPException(status_code=404, detail="User not found")
    return user

# Удаление ресурса с использованием DELETE
@app.delete("/users/{user_id}", status_code=204)
def delete_user(user_id: int):
    if user_id not in db:
        raise HTTPException(status_code=404, detail="User not found")
    del db[user_id]
    return