Je veux faire une demande POST via AJAX, et je veux également lier tout l'objet de classe à la demande, et je veux recevoir cette demande avec @requestParam
annotation. Je sais que cela peut être fait avec @requestBody
annotation, mais je suis curieux de savoir: peut-on le faire avec @requestParam
annotation?
Un code 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)
{
}
J'ai RestDTO
Class RestDTO
{
int id;
String name;
//getter and setter
}
Dans le contrôleur
public String content(@RequestParam RestDTO restDTO){...}
Que dois-je faire pour exécuter ce code?
Que dois-je changer lors de l'envoi de données depuis ajax?
Dois-je changer de serveur pour recevoir un objet RestDto avec @requestParam
annotation?
Vous ne pouvez pas, car @RequestParam
indique simplement que le paramètre de la méthode one doit être lié à un paramètre de requête Web one. Il ne peut pas faire de mappage avec des objets. Pour utilisation @RequestParam
vous devez modifier la demande ajax:
var restDTO{
id: 3,
name: "hello"
}
$.ajax({
url: url,
type: 'POST',
data: restDTO,
success: function(data){
....
}
});
JQuery enverra la demande en tant que application/x-www-form-urlencoded
et traitera automatiquement les données en paramètres. La méthode de votre contrôleur devrait ressembler à ceci:
@RequestMapping("/url")
public String content(@RequestParam Long id, @RequestParam String name){...}
Pour mapper automatiquement des paramètres à un objet, vous pouvez utiliser @ModelAttribute
annotation:
@RequestMapping("/url")
public String content(@ModelAttribute RestDTO restDTO){...}
Dans ce cas, les noms dans la carte javascript doivent correspondre aux noms des propriétés dans RestDTO
.
Généralement, @ModelAttribute
et @RequestBody
créé aux mêmes fins: pour lier les données de la requête à la méthode (qu'il s'agisse d'objets de type primitif).
Je considère que @ModelAttribute
est plus pratique lorsque vous travaillez avec des formulaires html et des objets simples. Il existe des capacités Spring prêtes à l'emploi comme modelAttribute
et path
.
À son tour, @RequestBody
plus flexible, lorsque vous avez besoin d'un contrôle manuel des données. En outre, c'est plus pratique lorsque vous travaillez avec des objets complexes.
Personnellement, je préfère @RequestBody
et json.
Si vous envoyez vos données en tant que paramètres de demande classiques, vous pouvez vous lier à l'objet en omettant simplement le @RequestParam
, donc
public String content(RestDTO restDTO){...}
Si vous envoyez json
, vous devez utiliser @RequestBody
.
Si vous insistez pour que @RequestParam
, notez que vous pouvez lier plusieurs valeurs à une carte, donc
public String content(@RequestParam Map<String, String> restDTO){...}
Du @RequestParam
doc
Si le paramètre de méthode est Map ou MultiValueMap et qu'un nom de paramètre n'est pas spécifié, le paramètre de carte est rempli avec tous les noms et valeurs de paramètre de demande.
Au printemps, vous avez ces annotations:
RequestParam - utilisé pour obtenir les paramètres (/ path? Name =)
PathVariable - utilisé pour les paramètres de chemin (/ chemin/{nom})
RequestBody - utilisé pour le corps post/put/patch etc.
RequestHeader - pour les en-têtes
Vous ne pouvez donc pas utiliser RequestParam pour les paramètres de publication, peu importe si json ou non