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

Приведи пример, когда срабатывает статус-код 405

1.0 Junior🔥 231 комментариев
#Тестирование API

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Пример использования статус-кода 405 (Method Not Allowed)

Статус-код 405 (Method Not Allowed) является частью стандарта HTTP и сигнализирует, что метод, использованный в запросе, не поддерживается целевым ресурсом (сервером или конкретным URI). Это один из клиентских ошибок (4xx), который указывает на проблему с самим запросом, а не с сервером. Сервер, возвращая 405, обязательно должен включить в ответ заголовок Allow, содержащий список разрешенных методов для данного ресурса.

Практический пример возникновения 405

Рассмотрим типичное REST API для управления пользователями (/api/users). Обычно этот ресурс поддерживает методы GET (для получения списка) и POST (для создания нового пользователя). Однако метод DELETE на этом коллекционном ресурсе (на всей коллекции пользователей) часто не разрешен из соображений безопасности или логики приложения.

Сценарий: Клиент пытается выполнить DELETE запрос на endpoint /api/users вместо удаления конкретного пользователя по ID (/api/users/{id}).

DELETE /api/users HTTP/1.1
Host: api.example.com
Authorization: Bearer <token>

Ответ сервера:

HTTP/1.1 405 Method Not Allowed
Allow: GET, POST
Content-Type: application/json

{
    "error": "Method Not Allowed",
    "message": "DELETE method is not supported for this resource. Use DELETE on /api/users/{id} to remove a specific user.",
    "status": 405
}

Почему это происходит и как обрабатывается

  1. Ограничения дизайна API: Сервер сознательно ограничивает набор операций на определенных маршрутах. Например, удаление всей коллекции — критическая операция, которая либо запрещена, либо требует специального, отдельного endpoint (например, /api/users/admin/purge).

  2. Защита от случайных или злонамеренных действий: Недопущение массового удаления без дополнительных проверок.

  3. Спецификация REST: Для конкретного ресурса (URI) допустим определенный набор методов. Клиент нарушает эту спецификацию.

С технической стороны, обработка выглядит так (пример на Node.js/Express):

// Определяем маршрут /api/users
app.route('/api/users')
    .get((req, res) => {
        // Обработка GET - возвращаем список пользователей
        res.json(users);
    })
    .post((req, res) => {
        // Обработка POST - создаём нового пользователя
        const newUser = createUser(req.body);
        res.status(201).json(newUser);
    })
    .all((req, res) => {
        // Для всех других методов (DELETE, PUT, PATCH, etc.) возвращаем 405
        res.set('Allow', 'GET, POST');
        res.status(405).json({
            error: 'Method Not Allowed',
            allowedMethods: ['GET', 'POST']
        });
    });

Как клиент должен реагировать на 405

  • Прочитать заголовок Allow: Узнать, какие методы действительно разрешены.
  • Изменить метод запроса: Если цель клиента — получить данные, использовать GET вместо POST.
  • Проверить документацию API: Убедиться, что используется правильный endpoint для желаемой операции. Например, для удаления нужно обратиться к ресурсу конкретного пользователя (/api/users/123) с методом DELETE, который там уже будет разрешен.

Другие типичные ситуации с 405

  • Попытка использовать POST на статическом HTML-файле, который предназначен только для GET.
  • Использование PUT или PATCH на ресурсе, который допускает только создание (POST) и чтение (GET), например, на лог-файле.
  • Попытка выполнить GET с телом запроса (что не запрещено стандартом, но часто блокируется серверными конфигурациями) на некоторых строго настроенных API.

Таким образом, 405 Method Not Allowed — это четкий сигнал от сервера о несоответствии метода запроса и контракта API. Его наличие помогает построить понятный и безопасный интерфейс между клиентом и сервером. Для QA Engineer важно понимать этот код, чтобы корректно составлять тест-кейсы для проверки валидных и невалидных методов на различных endpoint и убеждаться, что сервер возвращает правильный заголовок Allow.