Методът на заявката не се поддържа (405) през пролетта

1. Общ преглед

Тази бърза статия е фокусирана върху често срещана грешка - „Метод на заявка не се поддържа - 405“ - с която разработчиците се сблъскват, докато излагат своите API за конкретни HTTP глаголи, с Spring MVC.

Естествено, ще обсъдим и често срещаните причини за тази грешка.

2. Основи на метода на заявката

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

Нека също така да разгледаме много бързо основите - и да разберем методите за заявки, поддържани от Spring и някои от най-често срещаните класове тук.

В много опростен начин, MVC HTTP методите са основни операции, които една заявка може да задейства на сървъра. Например някои методи извличат данните от сървъра, други изпращат данни на сървъра, други могат да изтрият данните и т.н.

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

Spring декларира всички поддържани методи за заявка под enum 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(); } }

Забележете как примерът декларира метода findEfficiee () . Той не посочва конкретен метод за заявка, което означава, че този URL поддържа всички методи по подразбиране.

Можем да заявим API, като използваме различни поддържани методи, например, използвайки curl:

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

Естествено, ние можем да изпратим заявката по няколко начина - чрез проста команда за къдрене , Postman, AJAX и т.н.

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

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

Но това, което обсъждаме тук, е - разбира се - сценариите, когато заявката няма да бъде успешна.

Методът 405 не е разрешен “ е една от най-често срещаните грешки, които наблюдаваме по време на работа с пролетните заявки.

Нека да разгледаме какво се случва, ако конкретно дефинираме и обработим GET заявки в Spring MVC, по следния начин:

@RequestMapping( value = "/employees", produces = "application/json", method = RequestMethod.GET) public List findEmployees() { ... } // send the PUT request using CURL $ curl --request PUT //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 Not Support - Причина, решение

Това, което получаваме в този предишен сценарий, е 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.