Metodo di richiesta non supportato (405) in primavera

1. Panoramica

Questo rapido articolo è incentrato su un errore comune, "Metodo di richiesta non supportato - 405", che gli sviluppatori devono affrontare mentre espongono le proprie API per verbi HTTP specifici, con Spring MVC.

Naturalmente, discuteremo anche delle cause comuni di questo errore.

2. Nozioni di base sul metodo di richiesta

Prima di passare al problema comune, se stai appena iniziando a conoscere Spring MVC, ecco un buon articolo introduttivo per iniziare.

Diamo anche una rapida occhiata alle basi e comprendiamo i metodi di richiesta supportati da Spring e alcune delle classi di interesse comuni qui.

In un modo molto semplificato, i metodi HTTP MVC sono operazioni di base che una richiesta può attivare sul server. Ad esempio, alcuni metodi recuperano i dati dal server, alcuni inviano i dati al server, altri potrebbero eliminare i dati, ecc.

L' annotazione @RequestMapping specifica i metodi supportati per la richiesta.

Spring dichiara tutti i metodi di richiesta supportati sotto un RequestMethod enum ; specifica i verbi standard GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE .

Spring DispatcherServlet li supporta tutti per impostazione predefinita tranne OPTIONS e TRACE ; @RequestMapping utilizza l' enumerazione RequestMethod per specificare quali metodi sono supportati.

3. Scenario MVC semplice

Ora, diamo un'occhiata a un esempio di codice che mappa tutti i metodi 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(); } }

Notare come l'esempio dichiara il metodo findEmployee () . Non specifica alcun metodo di richiesta specifico, il che significa che questo URL supporta tutti i metodi predefiniti.

Possiamo richiedere l'API utilizzando diversi metodi supportati, ad esempio, utilizzando 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"}]

Naturalmente, possiamo inviare la richiesta in più modi: tramite un semplice comando curl , Postman, AJAX, ecc.

E, naturalmente, ci aspettiamo di ottenere la risposta 200 OK , se la richiesta è mappata correttamente e ha successo.

4. Scenario del problema: HTTP 405

Ma ciò di cui stiamo discutendo qui sono, ovviamente, gli scenari in cui la richiesta non avrà successo.

" 405 Method Not Allowed " è uno degli errori più comuni che osserviamo mentre lavoriamo con le richieste Spring.

Diamo un'occhiata a cosa succede se definiamo e gestiamo specificamente le richieste GET in Spring MVC, in questo modo:

@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 Non supportato - Motivo, soluzione

Quello che stiamo ottenendo in questo scenario precedente è la risposta HTTP con il codice di stato 405, un errore del client che indica che il server non supporta il metodo / verbo inviato nella richiesta.

Come suggerisce il nome qui, il motivo di questo errore è l'invio della richiesta con un metodo non supportato.

Come ci si può aspettare, possiamo risolvere questo problema definendo una mappatura esplicita per PUT, nella mappatura del metodo esistente:

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

In alternativa, possiamo definire separatamente il nuovo metodo / mappatura:

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

6. Conclusione

Il metodo / verbo di richiesta è un aspetto critico nella comunicazione HTTP e dobbiamo stare attenti all'esatta semantica delle operazioni che definiamo lato server, e quindi alle esatte richieste che stiamo inviando.

E come sempre, gli esempi mostrati in questo articolo sono disponibili su GitHub.