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

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

1. обзор

Эта небольшая статья посвящена распространенной ошибке - «Метод запроса не поддерживается» - 405 ', с которой сталкиваются разработчики, выставляя свои API-интерфейсы для определенных HTTP-глаголов в Spring MVC.

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

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

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

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

Упрощенно, методы MVC HTTP - это основные операции, которые запрос может инициировать на сервере. Например, некоторые методыfetch данные с сервера, некоторыеsubmit данные на сервер, некоторые могутdelete данные и т. Д.

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

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

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

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 Method Not Allowed» - одна из наиболее распространенных ошибок, которые мы наблюдаем при работе с запросами 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 -a client error that indicates that the server doesn’t support the method/verb sent in the request.

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

Как вы можете ожидать, мы можем решить эту проблему, определив явное отображение для 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-коммуникации, и нам нужно быть осторожными с точной семантикой операций, которые мы определяем на стороне сервера, а затем с точными запросами, которые мы отправляем.

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