> В чем разница HTTP методов GET, POST, PUT, DELETE и когда их использовать (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: ООО Диджитал Сектор Поддержка, GGSel, Sunlight
Стек: Python
> Пример ответа
Короткий ответ
GET, POST, PUT и DELETE - это стандартные HTTP-методы, которые описывают намерение клиента при работе с ресурсом. GET - безопасный и идемпотентный, используется для чтения. POST - неидемпотентный, создает новый ресурс или выполняет действие. PUT - идемпотентный, заменяет ресурс целиком. DELETE - идемпотентный, удаляет ресурс. Выбор метода определяется семантикой операции, а не "удобством" или привычкой.
Подробное объяснение
HTTP-методы - это часть спецификации RFC 9110, которая определяет семантику запроса. Ключевые свойства:
- Безопасность (safe): метод не изменяет состояние сервера. GET, HEAD, OPTIONS - безопасны.
- Идемпотентность (idempotent): повторный запрос с теми же параметрами дает тот же результат, что и первый. GET, PUT, DELETE, HEAD - идемпотентны. POST - нет.
GET - запрос на получение представления ресурса. Не должен иметь тела (хотя формально может, но это антипаттерн). Используется для чтения, поиска, фильтрации. Кэшируется, попадает в историю браузера, может быть закладкой.
POST - запрос на создание нового ресурса или выполнение действия, которое не подходит под другие методы. Неидемпотентен: два одинаковых POST создадут два разных ресурса. Используется для форм, загрузки файлов, RPC-подобных операций (например, /api/actions/start).
PUT - полная замена ресурса по известному URI. Идемпотентен: повторный PUT с тем же телом не изменит состояние после первого. Если ресурс не существует - может создать его (в некоторых API). Важно: PUT заменяет ресурс целиком, а не частично.
DELETE - удаление ресурса по URI. Идемпотентен: повторный DELETE вернет 404 или 204, но состояние не изменится. В некоторых реализациях может быть "мягкое удаление" (soft delete), но семантика метода сохраняется.
Дополнительно стоит упомянуть PATCH - частичное обновление, но он не входит в вопрос. Также важно различать PUT и PATCH: PUT - полная замена, PATCH - частичное изменение.
На практике
В реальном backend на Python (FastAPI, Django, Flask) выбор метода диктует структуру роутинга и контракт API. Например:
GET /users- список пользователейPOST /users- создание пользователяGET /users/{id}- получить одногоPUT /users/{id}- полностью заменить пользователяDELETE /users/{id}- удалить
Типичные ошибки на практике:
- Использование POST для обновления, потому что "так проще" - ломает идемпотентность и семантику.
- PUT с частичным телом - клиент не присылает все поля, сервер обнуляет остальные. Это нарушение контракта PUT.
- GET с телом для сложных фильтров - лучше использовать query parameters или POST, если параметры слишком сложные.
- DELETE с телом - большинство прокси и клиентов не поддерживают тело в DELETE, лучше передавать идентификатор в URI.
Также важно помнить про статус-коды: GET - 200, POST - 201 Created, PUT - 200 или 204, DELETE - 204 или 404.
Пример кода
Пример на FastAPI:
PYTHONfrom fastapi import FastAPI, HTTPException, statusfrom pydantic import BaseModelapp = FastAPI()class User(BaseModel):id: intname: stremail: strusers_db = {}@app.get("/users/{user_id}", status_code=status.HTTP_200_OK)def get_user(user_id: int):if user_id not in users_db:raise HTTPException(status_code=404, detail="User not found")return users_db[user_id]@app.post("/users", status_code=status.HTTP_201_CREATED)def create_user(user: User):if user.id in users_db:raise HTTPException(status_code=409, detail="User already exists")users_db[user.id] = userreturn user@app.put("/users/{user_id}", status_code=status.HTTP_200_OK)def replace_user(user_id: int, user: User):if user_id not in users_db:raise HTTPException(status_code=404, detail="User not found")users_db[user_id] = userreturn user@app.delete("/users/{user_id}", status_code=status.HTTP_204_NO_CONTENT)def delete_user(user_id: int):if user_id not in users_db:raise HTTPException(status_code=404, detail="User not found")del users_db[user_id]
Как отвечать на собеседовании
Начните с определения: "HTTP-методы - это глаголы, которые описывают намерение клиента". Затем перечислите четыре метода и их ключевые свойства: безопасность и идемпотентность. Приведите примеры использования для каждого. Обязательно упомяните разницу между PUT и POST, а также между PUT и PATCH. Если спросят про идемпотентность - объясните на примере: повторный POST создаст дубликат, повторный PUT - нет. Хорошо добавить про статус-коды, которые ожидаются для каждого метода. Если интервьюер спросит про кэширование - скажите, что GET кэшируется, а POST/PUT/DELETE - нет по умолчанию.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание семантики HTTP, а не просто заученных определений.
- Умение различать безопасность и идемпотентность.
- Знание практических следствий: кэширование, повторные запросы, идемпотентность в распределенных системах.
- Понимание разницы между PUT и PATCH, POST и PUT.
- Умение применить это к реальному API-дизайну.
Для senior-уровня важно показать, что вы понимаете, как эти методы влияют на проектирование API, обработку ошибок и поведение клиентов. Также ценится знание edge cases: например, что DELETE может быть неидемпотентным при мягком удалении, но семантически он остается идемпотентным.
Типичные ошибки
- Путаница между PUT и POST: "PUT - это обновление, POST - создание". На самом деле POST может создавать, а PUT - заменять.
- Утверждение, что GET не может иметь тело - формально может, но это плохая практика.
- Игнорирование идемпотентности: "DELETE повторно вернет ошибку, значит он неидемпотентен" - нет, идемпотентность означает, что состояние сервера не меняется, а не что ответ всегда 200.
- Использование POST для всего "чтобы не заморачиваться" - признак плохого API-дизайна.
- Неупоминание PATCH, когда речь идет о частичном обновлении - интервьюер может специально спросить про разницу.
> Похожие задачи по Python
Что такое множественное наследование и как работает метод разрешения порядка (MRO) в Python
Что можно увидеть в explain-плане запросов в Postgres
Какова алгоритмическая сложность добавления элемента в начало и конец списка в Python
Работал ли ты с Docker и Docker Compose
> Похожие задачи по backend
Что такое множественное наследование и как работает метод разрешения порядка (MRO) в Python
Что можно увидеть в explain-плане запросов в Postgres
Какова алгоритмическая сложность добавления элемента в начало и конец списка в Python
Работал ли ты с Docker и Docker Compose
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью