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 ListfindEmployees() 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 ListfindEmployees() { ... } // 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 ListpostEmployees() ...
6. Заключение
Метод/глагол запроса является критическим аспектом в HTTP-коммуникации, и мы должны быть осторожны с точной семантикой операций, которые мы определяем на стороне сервера, а затем с точными запросами, которые мы отправляем.
И, как всегда, примеры, показанные в этой статье, доступны на на GitHub .