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

Какая функция считается RESTful?

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

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

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

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

Что такое RESTful функция?

Вопрос подразумевает концепцию REST (Representational State Transfer) при проектировании веб-приложений. Это архитектурный стиль для веб-сервисов, где API следует определённым принципам.

1. Основные принципы REST

# REST — это стиль архитектуры, основанный на HTTP методах
# Ключевые принципы:

# 1. Ресурсы (Resources) — существительные
GET    /users          # получить всех пользователей
GET    /users/123      # получить пользователя с ID 123
POST   /users          # создать нового пользователя
PUT    /users/123      # заменить пользователя (полное обновление)
PATCH  /users/123      # частичное обновление
DELETE /users/123      # удалить пользователя

# ❌ Неправильно (глаголы в URL)
GET    /getUser/123
GET    /createUser
GET    /deleteUser/123

2. Правильные RESTful endpoint'ы

# ✅ RESTful подход

# Коллекции (множественное число)
GET    /api/v1/users              # список всех
POST   /api/v1/users              # создание нового

# Конкретный ресурс
GET    /api/v1/users/123           # получить конкретного
PUT    /api/v1/users/123           # заменить
PATCH  /api/v1/users/123           # обновить
DELETE /api/v1/users/123           # удалить

# Вложенные ресурсы
GET    /api/v1/users/123/posts     # посты пользователя 123
GET    /api/v1/users/123/posts/45  # конкретный пост
POST   /api/v1/users/123/posts     # создать пост для пользователя

# Операции над ресурсом (редко, но иногда нужны)
POST   /api/v1/users/123/avatar    # загрузить аватар
POST   /api/v1/comments/123/like   # лайк комментария

3. RESTful контроллер в FastAPI

from fastapi import APIRouter, HTTPException, status
from pydantic import BaseModel
from typing import List

router = APIRouter(prefix="/api/v1/users", tags=["users"])

class User(BaseModel):
    id: int
    name: str
    email: str

class UserCreate(BaseModel):
    name: str
    email: str

@router.get("")
async def list_users() -> List[User]:
    """Получить список всех пользователей"""
    return []

@router.get("/{user_id}")
async def get_user(user_id: int) -> User:
    """Получить конкретного пользователя"""
    raise HTTPException(status_code=404, detail="Not found")

@router.post("", status_code=201)
async def create_user(user: UserCreate) -> User:
    """Создать нового пользователя"""
    pass

@router.put("/{user_id}")
async def update_user(user_id: int, user: UserCreate) -> User:
    """Полное обновление пользователя"""
    pass

@router.patch("/{user_id}")
async def partial_update_user(user_id: int, user: dict) -> User:
    """Частичное обновление"""
    pass

@router.delete("/{user_id}", status_code=204)
async def delete_user(user_id: int):
    """Удалить пользователя"""
    pass

4. Правильные HTTP методы

  • GET — получение данных (safe и idempotent)
  • POST — создание нового ресурса (не idempotent)
  • PUT — полное обновление ресурса (idempotent)
  • PATCH — частичное обновление (может быть не idempotent)
  • DELETE — удаление ресурса (idempotent)
  • HEAD — GET без тела ответа
  • OPTIONS — информация о доступных методах

5. Правильные статус коды

200  OK              — успех
201  Created         — ресурс создан (POST)
202  Accepted        — принято, обработка в процессе
204  No Content      — успех, без тела (DELETE)
400  Bad Request     — ошибка валидации
401  Unauthorized    — не авторизован
403  Forbidden       — нет доступа
404  Not Found       — ресурс не найден
409  Conflict        — конфликт
500  Server Error    — ошибка сервера

6. Что НЕ является RESTful

# ❌ Неправильные примеры

# Глаголы в URL
GET  /api/getUser/123
GET  /api/createUser
GET  /api/deleteUser/123

# Неправильные HTTP методы
GET  /api/users/123/delete  # используй DELETE!
GET  /api/users/create      # используй POST!

# Случайная структура
GET  /get_users
POST /create_post
GET  /my/data/structure

7. Фильтрация, сортировка, пагинация

# ✅ Query параметры
GET  /api/v1/users?page=1&limit=10           # пагинация
GET  /api/v1/users?sort=name&order=asc       # сортировка
GET  /api/v1/users?status=active&role=admin  # фильтрация
GET  /api/v1/users?q=john                    # поиск

8. API Versioning

# ✅ Правильное вверсионирование
GET  /api/v1/users      # версия 1
GET  /api/v2/users      # версия 2
GET  /api/v3/users      # версия 3

Итоги

RESTful функция/контроллер должна:

  • Использовать существительные в URL (не глаголы)
  • Использовать правильные HTTP методы
  • Возвращать правильные статус коды
  • Работать с ресурсами как с сущностями
  • Быть stateless (не держать состояние)
  • Версионировать API
  • Поддерживать фильтрацию, сортировку, пагинацию

Главное правило: REST — это архитектурный стиль, где каждый URL это ресурс, а HTTP методы это операции над ними