Méthode de demande non prise en charge (405) au printemps

1. Vue d'ensemble

Cet article rapide se concentre sur une erreur courante - `` Méthode de demande non prise en charge - 405 '' - à laquelle les développeurs sont confrontés lorsqu'ils exposent leurs API pour des verbes HTTP spécifiques, avec Spring MVC.

Naturellement, nous discuterons également des causes courantes de cette erreur.

2. Informations de base sur la méthode de demande

Avant de passer au problème commun, si vous commencez tout juste à en savoir plus sur Spring MVC, voici un bon article d'introduction pour commencer.

Jetons également un regard très rapide sur les bases - et comprenons les méthodes de requête prises en charge par Spring et certaines des classes communes d'intérêt ici.

De manière très simplifiée, les méthodes HTTP MVC sont des opérations de base qu'une requête peut déclencher sur le serveur. Par exemple, certaines méthodes récupèrent les données du serveur, certaines soumettent des données au serveur, certaines peuvent supprimer les données, etc.

L' annotation @RequestMapping spécifie les méthodes prises en charge pour la demande.

Spring déclare toutes les méthodes de requête prises en charge sous une enum RequestMethod ; il spécifie les verbes standard GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE .

Le Spring DispatcherServlet les prend tous en charge par défaut, sauf OPTIONS et TRACE ; @RequestMapping utilise l' énumération RequestMethod pour spécifier les méthodes prises en charge.

3. Scénario MVC simple

Voyons maintenant un exemple de code qui mappe toutes les méthodes 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(); } }

Remarquez comment l'exemple déclare la méthode findEmployee () . Il ne spécifie aucune méthode de demande spécifique, ce qui signifie que cette URL prend en charge toutes les méthodes par défaut.

Nous pouvons demander l'API en utilisant différentes méthodes prises en charge, par exemple en utilisant 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"}]

Naturellement, nous pouvons envoyer la demande de plusieurs manières - via une simple commande curl , Postman, AJAX, etc.

Et, bien sûr, nous nous attendons à obtenir la réponse 200 OK , si la demande est correctement mappée et réussie.

4. Scénario de problème - le HTTP 405

Mais ce dont nous discutons ici, c'est bien sûr les scénarios dans lesquels la demande ne sera pas acceptée.

« Méthode 405 non autorisée » est l'une des erreurs les plus courantes que nous observons lorsque nous travaillons avec les requêtes Spring.

Voyons ce qui se passe si nous définissons et gérons spécifiquement les requêtes GET dans Spring MVC, comme ceci:

@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 - Raison, Solution

Ce que nous obtenons dans ce scénario précédent est la réponse HTTP avec le code d'état 405 - une erreur client qui indique que le serveur ne prend pas en charge la méthode / le verbe envoyé dans la demande.

Comme son nom l'indique ici, la raison de cette erreur est l'envoi de la demande avec une méthode non prise en charge.

Comme vous pouvez vous y attendre, nous pouvons résoudre ce problème en définissant un mappage explicite pour PUT, dans le mappage de méthode existant:

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

Alternativement, nous pouvons définir la nouvelle méthode / mappage séparément:

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

6. Conclusion

La méthode / le verbe de requête est un aspect critique de la communication HTTP, et nous devons faire attention à la sémantique exacte des opérations que nous définissons côté serveur, puis aux requêtes exactes que nous envoyons.

Et comme toujours, les exemples présentés dans cet article sont disponibles sur over sur GitHub.