Рубрики
Без рубрики

Метод запроса Не поддерживается (405) весной

Краткая статья, посвященная распространенной ошибке – “Метод запроса не поддерживается – 405”

Автор оригинала: baeldung.

1. Обзор

Эта краткая статья посвящена распространенной ошибке – “Метод запроса не поддерживается – 405”, с которой сталкиваются разработчики, предоставляя свои API для определенных HTTP – глаголов с помощью Spring MVC.

Естественно, мы также обсудим общие причины этой ошибки.

2. Основы метода запроса

Прежде чем перейти к общей проблеме, если вы только начинаете изучать Spring MVC, вот хорошая вступительная статья для начала.

Давайте также очень быстро рассмотрим основы – и поймем методы запроса, поддерживаемые Spring, и некоторые из общих классов, представляющих здесь интерес.

В очень упрощенном виде методы HTTP MVC-это основные операции, которые запрос может инициировать на сервере. Например, некоторые методы извлекают данные с сервера, некоторые отправляют данные на сервер, некоторые могут удалять данные и т. Д.

@RequestMapping аннотация указывает поддерживаемые методы для запроса.

Spring объявляет все поддерживаемые методы запроса под перечислением RequestMethod ; он указывает стандартные GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE глаголы.

Spring DispatcherServlet поддерживает все из них по умолчанию, за исключением OPTIONS и TRACE ; @RequestMapping использует перечисление RequestMethod , чтобы указать, какие методы поддерживаются.

3. Простой сценарий MVC

Теперь давайте рассмотрим пример кода, который сопоставляет все методы HTTP:

@RestController
@RequestMapping(value="/api")
public class RequestMethodController {

    @Autowired
    private EmployeeService service;

    @RequestMapping(value = "/employees", produces = "application/json")
    public List findEmployees()
      throws InvalidRequestException {
        return service.getEmployeeList();
    }
}

Обратите внимание, как в примере объявляется метод findEmployee () . Он не указывает какой-либо конкретный метод запроса, что означает, что этот URL-адрес поддерживает все методы по умолчанию.

Мы можем запросить API, используя различные поддерживаемые методы, например, с помощью curl:

$ curl --request POST http://localhost:8080/api/employees
[{"id":100,"name":"Steve Martin","contactNumber":"333-777-999"},
{"id":200,"name":"Adam Schawn","contactNumber":"444-111-777"}]

Естественно, мы можем отправить запрос несколькими способами – с помощью простой команды curl , Postman, AJAX и т. Д.

И, конечно же, мы ожидаем получить ответ 200 OK , если запрос правильно отображен и успешен.

4. Сценарий проблемы – HTTP 405

Но то, что мы здесь обсуждаем, – это, конечно, сценарии, когда запрос не будет успешным.

405 Метод Не разрешен ” – одна из наиболее распространенных ошибок, которые мы наблюдаем при работе с запросами Spring.

Давайте посмотрим, что произойдет, если мы специально определим и обработаем запросы GET в Spring MVC, как это:

@RequestMapping(
  value = "/employees", 
  produces = "application/json", 
  method = RequestMethod.GET)
public List findEmployees() {
    ...
}

// send the PUT request using CURL
$ curl --request PUT http://localhost:8080/api/employees
{"timestamp":1539720588712,"status":405,"error":"Method Not Allowed",
"exception":"org.springframework.web.HttpRequestMethodNotSupportedException",
"message":"Request method 'PUT' not supported","path":"/api/employees"}

5. 405 Не Поддержка – Причина, Решение

В этом предыдущем сценарии мы получаем HTTP – ответ с кодом состояния 405 – ошибка клиента, указывающая на то, что сервер не поддерживает метод/глагол, отправленный в запросе.

Как следует из названия, причиной этой ошибки является отправка запроса с помощью неподдерживаемого метода.

Как вы можете ожидать, мы можем решить эту проблему, определив явное сопоставление для PUT в существующем сопоставлении методов:

@RequestMapping(
  value = "/employees", 
  produces = "application/json", 
  method = {RequestMethod.GET, RequestMethod.PUT}) ...

В качестве альтернативы мы можем определить новый метод/отображение отдельно:

@RequestMapping(value = "/employees", 
  produces = "application/json", 
  method=RequestMethod.PUT)
public List postEmployees() ...

6. Заключение

Метод/глагол запроса является критическим аспектом в HTTP-коммуникации, и мы должны быть осторожны с точной семантикой операций, которые мы определяем на стороне сервера, а затем с точными запросами, которые мы отправляем.

И, как всегда, примеры, показанные в этой статье, доступны на на GitHub .