1. Información general
Este artículo rápido se centra en un error común - 'Método de solicitud no compatible - 405' - que enfrentan los desarrolladores al exponer sus API para verbos HTTP específicos, con Spring MVC.
Naturalmente, también discutiremos las causas comunes de este error.
2. Conceptos básicos del método de solicitud
Antes de avanzar hacia el problema común, si recién está comenzando a aprender sobre Spring MVC, aquí hay un buen artículo de introducción para comenzar.
También echemos un vistazo rápido a los conceptos básicos y comprendamos los métodos de solicitud admitidos por Spring y algunas de las clases comunes de interés aquí.
De una manera muy simplificada, los métodos HTTP de MVC son operaciones básicas que una solicitud puede desencadenar en el servidor. Por ejemplo, algunos métodos obtienen los datos del servidor, algunos envían datos al servidor, algunos pueden eliminar los datos, etc.
La anotación @RequestMapping especifica los métodos admitidos para la solicitud.
Spring declara todos los métodos de solicitud admitidos bajo una enumeración RequestMethod ; especifica los verbos estándar GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE .
Spring DispatcherServlet soporta todos ellos por defecto excepto OPTIONS y TRACE ; @RequestMapping usa la enumeración RequestMethod para especificar qué métodos son compatibles.
3. Escenario MVC simple
Ahora, echemos un vistazo a un ejemplo de código que mapea todos los métodos 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(); } }
Observe cómo el ejemplo declara el método findEmployee () . No especifica ningún método de solicitud específico, lo que significa que esta URL admite todos los métodos predeterminados.
Podemos solicitar la API usando diferentes métodos compatibles, por ejemplo, usando 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, podemos enviar la solicitud de varias formas: mediante un simple comando curl , Postman, AJAX, etc.
Y, por supuesto, esperamos obtener la respuesta 200 OK , si la solicitud está correctamente asignada y es exitosa.
4. Situación de problemas: HTTP 405
Pero, lo que estamos discutiendo aquí son, por supuesto, los escenarios en los que la solicitud no tendrá éxito.
El ' Método 405 no permitido ' es uno de los errores más comunes que observamos al trabajar con solicitudes de Spring.
Echemos un vistazo a lo que sucede si definimos y manejamos específicamente las solicitudes GET en Spring MVC, así:
@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 No es compatible: motivo, solución
Lo que obtenemos en este escenario anterior es la respuesta HTTP con el código de estado 405, un error del cliente que indica que el servidor no admite el método / verbo enviado en la solicitud.
Como sugiere el nombre aquí, el motivo de este error es enviar la solicitud con un método no compatible.
Como puede esperar, podemos resolver esto definiendo un mapeo explícito para PUT, en el mapeo del método existente:
@RequestMapping( value = "/employees", produces = "application/json", method = {RequestMethod.GET, RequestMethod.PUT}) ...
Alternativamente, podemos definir el nuevo método / mapeo por separado:
@RequestMapping(value = "/employees", produces = "application/json", method=RequestMethod.PUT) public List postEmployees() ...
6. Conclusión
El método / verbo de solicitud es un aspecto crítico en la comunicación HTTP, y debemos tener cuidado con la semántica exacta de las operaciones que definimos en el lado del servidor, y luego con las solicitudes exactas que estamos enviando.
Y como siempre, los ejemplos que se muestran en este artículo están disponibles en GitHub.