Комментарии (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
- Используй существительные для ресурсов:
/users,/posts(не/getUsers) - HTTP методы определяют действие: GET, POST, PUT, DELETE
- ID в URL:
/users/123, не в параметрах - Иерархия ресурсов:
/users/123/posts/456 - Версионирование:
/api/v1/users - Консистентные статус-коды: 201 для создания, 204 для успешного удаления
REST был разработан Roy Fielding и стал стандартом де-факто для построения масштабируемых веб-сервисов.