Ответ
REST (Representational State Transfer) — это архитектурный стиль для создания распределенных систем, основанный на наборе принципов (ограничений), которые определяют, как взаимодействуют компоненты системы.
Ключевые принципы REST:
-
Клиент-серверная модель (Client-Server) Разделение ответственности: клиент отвечает за пользовательский интерфейс, а сервер — за хранение и обработку данных. Это позволяет им развиваться независимо.
-
Отсутствие состояния (Stateless) Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его выполнения. Сервер не хранит состояние клиента между запросами. Это повышает надежность, видимость и масштабируемость системы.
-
Кэширование (Cacheable) Ответы сервера должны явно помечаться как кэшируемые или некэшируемые. Это позволяет клиентам и промежуточным узлам (например, CDN) сохранять копии ответов для улучшения производительности.
-
Единообразие интерфейса (Uniform Interface) Это фундаментальный принцип, который упрощает и стандартизирует архитектуру. Он включает в себя:
- Идентификация ресурсов: Ресурсы (например,
/users/123) однозначно идентифицируются с помощью URI. - Манипуляция ресурсами через представления: Клиент взаимодействует с представлением ресурса (например, JSON), а не с самим ресурсом.
- Использование стандартных HTTP-методов:
GET(получение),POST(создание),PUT(полное обновление),PATCH(частичное обновление),DELETE(удаление).
- Идентификация ресурсов: Ресурсы (например,
-
Многоуровневая система (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