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

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

1. Vue d'ensemble

Cet article rapide est axé sur une erreur commune - "Requête 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. Principes de base de la méthode de demande

Avant de passer au problème courant, si vous commencez tout juste à en savoir plus sur Spring MVC, voici un bonintro article pour commencer.

Examinons également très rapidement les principes de base et comprenons les méthodes de requête prises en charge par Spring et certaines des classes d'intérêt courantes 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éthodesfetch les données du serveur, certaines donnéessubmit vers le serveur, certaines peuventdelete les données, etc.

Le@RequestMapping annotation pé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 énumérationRequestMethod; il spécifie les verbes standards deGET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE.

LesSpring DispatcherServlet les prennent tous en charge par défaut saufOPTIONS etTRACE; @RequestMapping uspend lesRequestMethod enum 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();
    }
}

Notez comment l'exemple déclare la méthodefindEmployee(). Elle 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 http://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 requête de plusieurs manières - via une simple commandecurl, Postman, AJAX, etc.

Et, bien sûr, nous nous attendons à obtenir la réponse200 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, bien sûr, ce sont les scénarios dans lesquels la demande échoue.

«405 Method Not Allowed» 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 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 pas pris en charge - raison, solution

Ce que nous obtenons dans ce scénario précédent est la réponse HTTP avec le code d'état 405 -a client error that indicates that the server doesn’t support the method/verb sent in the request.

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

Comme vous pouvez vous en douter, 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 surover on GitHub.