Ответ
Технически — да, но это нарушает семантику HTTP и является плохой практикой в DevOps и разработке API.
HTTP метод GET предназначен для безопасных (safe) и идемпотентных операций получения данных. Он не должен изменять состояние сервера.
Почему это плохо:
- Кэширование: Прокси-серверы, CDN (например, CloudFront) и браузеры могут кэшировать GET-запросы. Последующий идентичный запрос может вернуть закэшированный старый результат, а операция обновления не выполнится.
- Веб-сканеры и боты: Поисковые роботы или инструменты безопасности, сканирующие сайт, могут ненамеренно вызывать деструктивные операции.
- Надёжность и логирование: В логах (ELK Stack, CloudWatch) будет сложно отличить запрос на чтение от запроса на изменение.
- RESTful-архитектура: Нарушает принципы REST, где методы HTTP имеют четкую семантику (GET для чтения, POST/PUT/PATCH для изменения).
Правильный подход в DevOps-практике:
- Для создания ресурса используйте POST.
- Для полного обновления — PUT.
- Для частичного обновления — PATCH.
- Для удаления — DELETE.
Пример корректной реализации на примере Nginx + бэкенд:
# В конфигурации Nginx можно явно ограничить методы для критичных endpoint'ов
location /api/v1/resource {
limit_except GET {
deny all; # Запрещает все методы, кроме GET, для этого location
}
proxy_pass http://backend;
}
В коде приложения (например, на Python/Flask) всегда проверяйте метод:
@app.route('/api/update', methods=['POST']) # Явно указываем допустимый метод
def update_resource():
# Логика обновления
return jsonify({'status': 'updated'}), 200