Ответ
Использование POST для всех операций — это антипаттерн, который значительно усложняет тестирование, анализ и поддержку API. Как QA-инженер, я сталкиваюсь со следующими проблемами:
1. Нарушение семантики и усложнение тестирования:
- GET должен быть безопасным (safe) и идемпотентным. Если его заменяет POST, мы не можем быть уверены, что запрос на получение данных ничего не изменит на сервере. Это ломает базовые предположения для тестирования.
- PUT/DELETE — идемпотентны. Подмена их на неидемпотентный POST делает невозможным надежное тестирование повторных отправок и восстановления после сбоев.
2. Потеря возможностей инструментов:
- Кэширование для GET-запросов в браузерах и прокси-серверах перестает работать, что сложнее проверить на производительность.
- Логи и мониторинг (например, в Kibana, Grafana) становятся менее информативными — все запросы одного типа.
- Автоматические сканеры безопасности не смогут корректно классифицировать уязвимости.
3. Прямые последствия для тест-кейсов:
# ПЛОХО: Неясная семантика, сложно тестировать
response = requests.post('/api/data', json={'action': 'fetchUser', 'id': 5})
# Это получение? Или создание действия 'fetchUser'?
# ХОРОШО: Ясная семантика, предсказуемое тестирование
response = requests.get('/api/users/5') # Получить пользователя
response = requests.post('/api/users', json={...}) # Создать пользователя
response = requests.delete('/api/users/5') # Удалить пользователя
# Для каждого метода у нас четкие ожидания по кодам ответа, идемпотентности и побочным эффектам.
Следование стандартам HTTP — это не догма, а практика, которая делает API предсказуемым и, как следствие, более простым для полноценного тестирования.