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

Можно ли удалить объект с помощью GET?

1.0 Junior🔥 131 комментариев
#Интеграции и API

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

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

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

Можно ли удалить объект с помощью GET

Технически — да, можно. Но это крайне плохая практика, которая нарушает основные принципы REST и веб-разработки. Давайте разберёмся почему.

Технически возможно

С чисто технической точки зрения, GET — это просто HTTP метод, и сервер может выполнить любой код при его получении. Вот неправильный пример:

# ❌ ПЛОХО - Не делай так!
from flask import Flask, request

app = Flask(__name__)

@app.route('/users/<id>', methods=['GET'])
def delete_user(id):
    # Удаляем пользователя при GET запросе
    User.query.filter_by(id=id).delete()
    db.session.commit()
    return f"User {id} deleted"

# Клиент может удалить пользователя просто открыв ссылку:
# GET http://api.example.com/users/123  → удаляется пользователь 123

Да, это работает. Но почему это ужасно?

Почему это плохая идея

1. Нарушает семантику HTTP

  • GET должен быть безопасным (safe) — не должен менять состояние сервера
  • GET должен быть идемпотентным (idempotent) — повторный вызов даёт тот же результат
  • DELETE имеет противоположный эффект

HTTP спецификация чётко говорит:

  • GET/HEAD/OPTIONS — безопасные методы
  • PUT/DELETE — небезопасные, должны менять состояние

2. Безопасность — ОГРОМНАЯ проблема

  • Браузер может кешировать GET запросы
  • Скан с помощью curl или wget может удалить все объекты
  • Пользователь может случайно открыть такую ссылку
  • Боты и поисковые системы тоже отправляют GET запросы

Страшный реальный пример:

GET /api/users/delete?id=123

Если это ссылка на странице, то:

  • Любой посетитель, кто откроет страницу, отправит этот запрос
  • Если пользователь залогинен, запрос будет авторизован
  • Объект удалится без ведома пользователя (CSRF уязвимость)

3. Проблемы с прокси и кешированием

  • Прокси/CDN могут кешировать GET и переиспользовать ответ
  • При удалении эта кеш будет стаять
  • Клиенты могут получить устаревшие данные

4. Нарушает REST принципы

  • REST это не просто HTTP API, это архитектурный стиль
  • Одно из ключевых правил REST: HTTP методы имеют стандартные значения
  • Если нарушить это, то это не REST, а просто RPC

5. Проблемы с клиентами

  • Браузер может отправить GET без подтверждения
  • DELETE обычно требует подтверждения
  • Разработчики могут ошибиться и вызвать GET вместо DELETE

Правильный способ удаления

✅ ПРАВИЛЬНО - Используй DELETE

from flask import Flask

app = Flask(__name__)

@app.route('/api/users/<id>', methods=['DELETE'])
def delete_user(id):
    user = User.query.get(id)
    if not user:
        return {"error": "Not found"}, 404
    
    db.session.delete(user)
    db.session.commit()
    return {"message": f"User {id} deleted"}, 204

Клиент вызывает:

DELETE /api/users/123

Особенности DELETE:

  • Браузер не будет кешировать
  • Не будет отправлен случайно при открытии ссылки
  • Разработчик явно пишет DELETE, значит понимает, что удаляет
  • Безопасен от CSRF (DELETE требует explicit запроса, не просто открытие ссылки)

Таблица: GET vs DELETE vs POST

МетодБезопасныйИдемпотентныйКешируетсяИспользование
GET✅ Да✅ Да✅ ДаЧтение данных
DELETE❌ Нет✅ Да❌ НетУдаление
POST❌ Нет❌ Нет❌ НетСоздание, сложные операции
PUT❌ Нет✅ Да❌ НетОбновление

Безопасный (Safe) — не должен иметь side-effects Идемпотентный (Idempotent) — повторный вызов даёт тот же результат

Исключение: GET с побочным эффектом (редко)

Есть очень редкие случаи, когда GET может что-то менять, но это всегда неправильно:

❌ GET /logout

  • Правильно: POST /logout или DELETE /sessions/me

❌ GET /subscription/upgrade

  • Правильно: POST /subscriptions или PUT /subscriptions/{id}

❌ GET /generate-report (с сохранением в БД)

  • Правильно: POST /reports, потом GET /reports/{id}

Реальный пример из практики

Одна компания использовала GET /admin/user/delete?id=123. Результат:

  1. Google бот проиндексировал эту страницу
  2. Google в фоне отправлял GET запросы ко всем ссылкам
  3. За ночь были удалены все пользователи

Итог: потеря данных, судебные иски, увольнения инженеров.

Правило для Business Analyst

Если разработчик говорит "мы удаляем через GET", нужно:

  1. Объяснить, почему это неправильно
  2. Потребовать исправления
  3. Добавить в checklist: "API использует правильные HTTP методы"

Ответ на вопрос

Технически: Да, можно Правильно: Нет, никогда Что использовать: DELETE метод Штраф: Потеря данных, CSRF уязвимость, нарушение REST, проблемы с кешированием

Это один из фундаментальных принципов веб-разработки. Если его нарушить — это приводит к проблемам безопасности и логики.