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

Какие знаешь операции в REST?

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

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

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

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

REST операции (CRUD и HTTP методы)

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

Основные HTTP методы в REST

GET — получение ресурса

  • Безопасный метод (не изменяет состояние сервера)
  • Идемпотентный (несколько запросов дают одинаковый результат)
  • Пример: GET /api/v1/users/123 — получить пользователя с ID 123
  • Параметры передаются в URL или query string

POST — создание нового ресурса

  • Не идемпотентный (каждый запрос может создать новый ресурс)
  • Данные передаются в теле запроса
  • Пример: POST /api/v1/users с телом {"name": "John"} — создать нового пользователя
  • Возвращает статус 201 Created с новым ресурсом

PUT — полное обновление ресурса

  • Идемпотентный (обновление один или несколько раз даёт одинаковый результат)
  • Требует полное представление ресурса
  • Пример: PUT /api/v1/users/123 с полным объектом пользователя
  • Если ресурса нет, может его создать

PATCH — частичное обновление ресурса

  • Идемпотентный
  • Требует только те поля, которые нужно обновить
  • Пример: PATCH /api/v1/users/123 с {"name": "Jane"} — обновить только имя

DELETE — удаление ресурса

  • Идемпотентный (удаление несуществующего ресурса — безопасно)
  • Пример: DELETE /api/v1/users/123 — удалить пользователя
  • Возвращает статус 204 No Content

Статус-коды ответов

  • 2xx Success — 200 OK, 201 Created, 204 No Content
  • 3xx Redirection — 301 Moved Permanently, 304 Not Modified
  • 4xx Client Error — 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
  • 5xx Server Error — 500 Internal Server Error, 503 Service Unavailable

Пример реализации REST API на Python с FastAPI

from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel

app = FastAPI()

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

users_db = {}

@app.get("/api/v1/users/{user_id}")
async def get_user(user_id: int):
    """GET — получить пользователя"""
    if user_id not in users_db:
        raise HTTPException(status_code=404, detail="User not found")
    return users_db[user_id]

@app.post("/api/v1/users", status_code=201)
async def create_user(user: User):
    """POST — создать пользователя"""
    users_db[user.id] = user
    return user

@app.put("/api/v1/users/{user_id}")
async def update_user(user_id: int, user: User):
    """PUT — полное обновление"""
    if user_id not in users_db:
        raise HTTPException(status_code=404, detail="User not found")
    users_db[user_id] = user
    return user

@app.patch("/api/v1/users/{user_id}")
async def partial_update_user(user_id: int, updates: dict):
    """PATCH — частичное обновление"""
    if user_id not in users_db:
        raise HTTPException(status_code=404, detail="User not found")
    user = users_db[user_id]
    for key, value in updates.items():
        if hasattr(user, key):
            setattr(user, key, value)
    return user

@app.delete("/api/v1/users/{user_id}", status_code=204)
async def delete_user(user_id: int):
    """DELETE — удалить пользователя"""
    if user_id not in users_db:
        raise HTTPException(status_code=404, detail="User not found")
    del users_db[user_id]

Ключевые различия PUT vs PATCH

  • PUT: PUT /users/1 + {"name": "Alice"} → остальные поля теряются
  • PATCH: PATCH /users/1 + {"name": "Alice"} → остальные поля сохраняются

В современной практике PATCH предпочтительнее, так как безопаснее для частичных обновлений.

Правила проектирования REST API

  1. Используй существительные для ресурсов: /users, /posts (не /getUsers)
  2. HTTP методы определяют действие: GET, POST, PUT, DELETE
  3. ID в URL: /users/123, не в параметрах
  4. Иерархия ресурсов: /users/123/posts/456
  5. Версионирование: /api/v1/users
  6. Консистентные статус-коды: 201 для создания, 204 для успешного удаления

REST был разработан Roy Fielding и стал стандартом де-факто для построения масштабируемых веб-сервисов.

Какие знаешь операции в REST? | PrepBro