Quiero hacer una solicitud POST a través de AJAX, y también quiero vincular el objeto de clase completo a la solicitud, y quiero recibir esa solicitud con la anotación @requestParam . Sé que se puede hacer con la anotación @requestBody , pero tengo curiosidad por saber: ¿podemos hacerlo con la anotación @requestParam ?
Un código Ajax:
var restDTO{ id: 3, name: "hello" } $.ajax({ url: url, type: 'POST', dataType: 'json', contentType: 'application/json', mimeType: 'application/json', data: JSON.stringify({RestDTO : restDTO}), success: function(data) { }Tengo RestDTO
Class RestDTO { int id; String name; //getter and setter }en el controlador
public String content(@RequestParam RestDTO restDTO){...}¿Qué debo hacer para ejecutar este código?
¿Qué debo cambiar al enviar datos desde ajax?
¿Necesito cambiar en el servidor para recibir un objeto @requestParam ?
No puede, porque @RequestParam solo indica que el parámetro de un método debe vincularse al parámetro de una solicitud web. No puede hacer mapeo a objetos. Para usar @RequestParam , debe cambiar la solicitud ajax:
var restDTO{ id: 3, name: "hello" } $.ajax({ url: url, type: 'POST', data: restDTO, success: function(data){ .... } }); JQuery enviará la solicitud como application/x-www-form-urlencoded y procesará los datos a los parámetros automáticamente. El método de su controlador debería tener el siguiente aspecto:
@RequestMapping("/url") public String content(@RequestParam Long id, @RequestParam String name){...} Para asignar automáticamente parámetros a objetos, puede usar la anotación @ModelAttribute :
@RequestMapping("/url") public String content(@ModelAttribute RestDTO restDTO){...} En este caso, los nombres en el mapa de JavaScript deben coincidir con los nombres de las propiedades en RestDTO .
En general, @ModelAttribute y @RequestBody se crearon con los mismos propósitos: vincular datos de la solicitud al método (ya sean objetos de tipo primitivo).
Considero que @ModelAttribute es más conveniente cuando trabaja con formularios html y objetos simples. Hay habilidades Spring listas para usar como modelAttribute y path .
A su vez, @RequestBody es más flexible cuando necesita control manual sobre los datos. Además, es más conveniente cuando se trabaja con objetos complejos.
Personalmente, preferiría @RequestBody y json.
Si está enviando sus datos como parámetros de solicitud clásicos, puede vincular el objeto simplemente omitiendo el @RequestParam , por lo que
public String content(RestDTO restDTO){...} Si está enviando json , debe usar @RequestBody .
Si por alguna razón insiste en @RequestParam , tenga en cuenta que puede vincular varios valores en un mapa, por lo que
public String content(@RequestParam Map<String, String> restDTO){...} Del documento @RequestParam
Si el parámetro del método es Map o MultiValueMap y no se especifica un nombre de parámetro, el parámetro de mapa se completa con todos los nombres y valores de los parámetros de solicitud.
En spring web tienes estas anotaciones:
RequestParam: se utiliza para obtener parámetros (/path?name=)
PathVariable: se utiliza para parámetros de ruta (/ruta/{nombre})
RequestBody: se utiliza para el cuerpo de publicación/colocación/parche, etc.
RequestHeader - para encabezados
Por lo tanto, no puede usar RequestParam para publicar parámetros, no importa si json o no