responsebody - ¿Puede Spring MVC tener parámetros de solicitud para un método HTTP PUT, o debo usar la publicación? ¿Cuál debo usar para ser RESTful?
spring rest ejemplo (4)
Tengo una acción de controlador que creo que debería ser un PUT de HTTP, pero Spring se queja cuando trato de usar @RequestParam en la acción del controlador. ¿Los parámetros de solicitud no están permitidos para los métodos HTTP PUT, y es por eso que Spring los rechaza?
@RequestMapping(value = "/{helpDocumentId}/vote", method = RequestMethod.PUT)
public void voteHelpfulness(@PathVariable long helpDocumentId, @RequestParam boolean isHelpful) {
helpManager.voteOnHelpDocument(helpDocumentId, isHelpful);
}
Cuando se ejecuta, lanza este error:
org.springframework.web.bind.MissingServletRequestParameterException: Required boolean parameter ''isHelpful'' is not present
Por supuesto, el parámetro isHelpful
está presente. Puedo hacer que el código anterior funcione perfectamente para HTTP POST, así que sé que este no es el problema.
$.ajax({
url: "/help/" + helpDocumentId + "/vote.json",
type: "PUT",
data: {
isHelpful: isHelpful
},
success: function(response) {
// ....
}
});
¿PONER el método http correcto? Esta acción modifica el documento de helpDocument
, pero no crea uno.
Esto, como se sugiere anteriormente, parece ser un error en la spring/servlet API
. En realidad, se supone que las solicitudes PUT
funcionan en el Request Body (or payload)
y no en los parámetros de la solicitud. En ese sentido, el API del servlet y el manejo del resorte es correcto.
Dicho esto, una solución mejor y mucho más sencilla es no pasar ningún elemento de datos de su llamada javascript/jQuery
y pasar sus parámetros como parte de la url en sí. es decir, establezca los parámetros en el campo de url de la forma en que lo haría en una llamada GET
.
$.ajax({
url: "/help/" + helpDocumentId + "/vote.json" + "?param1=param2Val&..",
type: "PUT",
data: "",
success: function(response) {
// ....
}
});
ahora esto funciona para parámetros simples, supongo, no funcionará para tipos JSON complejos. Espero que esto ayude.
Los controladores Spring admiten GET / HEAD / POST / PUT / DELETE / OPTIONS / TRACE, pero como su navegador no puede enviar estos métodos de solicitud, no funcionará para usted.
La solución es usar el "org.springframework.web.filter.HiddenHttpMethodFilter" proporcionado por Spring. Requiere que pase un parámetro oculto para el método de solicitud. El parámetro predeterminado admitido por este filtro es "_method".
Compruebe el javadoc del filtro para más información.
Seguí la recomendación en los comentarios y cambié @RequestParam
a @RequestBody
y simplemente funcionó (mi parámetro es una cadena).
Estoy de acuerdo en que este es un error en Spring porque el mismo código que falla en mi entorno de producción (cuando uso @RequestParam
) funciona bien en localhost.
Since primavera 3.1, HttpPutFormContentFilter se puede usar para manejar datos de application/x-www-form-urlencoded
:
Filtro que hace que los datos codificados del formulario estén disponibles a través de la familia de métodos
ServletRequest.getParameter*()
durante las solicitudes HTTP PUT.La especificación de Servlet requiere que los datos de formulario estén disponibles para HTTP POST pero no para las solicitudes HTTP PUT. Este filtro intercepta las solicitudes HTTP PUT donde el tipo de contenido es
''application/x-www-form-urlencoded''
, lee el contenido codificado del formulario de la solicitud y envuelve la solicitud de Servlet para que los datos del formulario estén disponibles como parámetros de la solicitud. es para solicitudes HTTP POST.
Para otros datos entrantes, como JSON, necesitará @RequestBody
como se explica en JQuery, Spring MVC @RequestBody y JSON: para que funcionen juntos , no se ejecutan en un 415 tipo de medio no compatible.