Quelle est la différence entre @RequestParam
et @PathVariable
lors de la gestion des caractères spéciaux?
+
a été accepté par @RequestParam
comme espace.
Dans le cas de @PathVariable
, a +
été accepté comme +
.
Quelle est la différence entre @RequestParam
et @PathVariable
lors de la gestion des caractères spéciaux?
+
a été accepté par @RequestParam
comme espace.
Dans le cas de @PathVariable
, a +
été accepté comme +
.
Réponses:
@PathVariable
consiste à obtenir un espace réservé à partir de l'URI (Spring l'appelle un modèle d'URI) - voir Spring Reference Chapter 16.3.2.2 URI Template Patterns@RequestParam
consiste à obtenir également un paramètre à partir de l'URI - voir Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamSi l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
reçoit les factures de l'utilisateur 1234 le 5 décembre 2013, la méthode du contrôleur ressemblerait à:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
En outre, les paramètres de demande peuvent être facultatifs et, à partir de Spring 4.3.3, les variables de chemin peuvent également être facultatives . Attention cependant, cela pourrait changer la hiérarchie du chemin URL et introduire des conflits de mappage de demande. Par exemple, /user/invoices
fournirait les factures de l'utilisateur null
ou des détails sur un utilisateur avec un ID "factures"?
@PathParam
ne fonctionne que s'il y a un espace réservé dans le modèle uri)
@PathParam
est une annotation javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Annotation @RequestParam utilisée pour accéder aux valeurs des paramètres de requête à partir de la demande. Regardez l'URL de demande suivante:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
Dans la demande d'URL ci-dessus, les valeurs de param1 et param2 sont accessibles comme suit:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Voici la liste des paramètres pris en charge par l'annotation @RequestParam:
@PathVariable
@ PathVariable identifie le modèle utilisé dans l'URI pour la demande entrante. Regardons l'URL de demande ci-dessous:
http: // localhost: 8080 / springmvc / hello / 101? param1 = 10 & param2 = 20
La demande d'URL ci-dessus peut être écrite dans votre MVC Spring comme ci-dessous:
@RequestMapping("/hello/{id}") public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
L' annotation @ PathVariable n'a qu'une seule valeur d'attribut pour lier le modèle d'URI de demande. Il est autorisé d'utiliser l' annotation multiple @ PathVariable dans la méthode unique. Mais, assurez-vous que pas plus d'une méthode a le même modèle.
Il y a aussi une autre annotation intéressante: @MatrixVariable
Et la méthode du contrôleur pour cela
@RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {
logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });
List<List<String>> outlist = map2List(matrixVars);
model.addAttribute("stocks", outlist);
return "stocks";
}
Mais vous devez activer:
<mvc:annotation-driven enableMatrixVariables="true" >
userName
aura un type param ou non? Je penche pour en faire une variable, mais cela pourrait aussi être un paramètre.
@PathParam
et @RequestParam
être déclaré sans utiliser@RequestMapping
@RequestParam est utilisé pour les paramètres de requête (valeurs statiques) comme: http: // localhost: 8080 / calcul / pow? Base = 2 & ext = 4
@PathVariable est utilisé pour des valeurs dynamiques comme: http: // localhost: 8080 / calcul / sqrt / 8
@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
int pow = (int) Math.pow(base1, ext1);
return pow;
}
@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
double sqrtnum=Math.sqrt(num1);
return sqrtnum;
}
1) @RequestParam
est utilisé pour extraire les paramètres de requête
http://localhost:3000/api/group/test?id=4
@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
while @PathVariable
est utilisé pour extraire les données directement de l'URI:
http://localhost:3000/api/group/test/4
@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
2) @RequestParam
est plus utile sur une application Web traditionnelle où les données sont principalement transmises dans les paramètres de requête, tandis qu'elle @PathVariable
convient mieux aux services Web RESTful où l'URL contient des valeurs.
3) l' @RequestParam
annotation peut spécifier des valeurs par défaut si un paramètre de requête n'est pas présent ou vide en utilisant un defaultValue
attribut, à condition que l'attribut requis soit false
:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
return "Required element of request param";
}
}
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
http://localhost:8080/employee/call/7865467
@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = false) String callStatus) {
}
http://localhost:8080/app/call/7865467?status=Cancelled
@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = true) String callStatus) {
}
Les deux annotations se comportent exactement de la même manière.
Seulement 2 caractères spéciaux '!' et '@' sont acceptés par les annotations @PathVariable et @RequestParam.
Pour vérifier et confirmer le comportement, j'ai créé une application de démarrage à ressort qui ne contient qu'un seul contrôleur.
@RestController
public class Controller
{
@GetMapping("/pvar/{pdata}")
public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
{
return pathdata;
}
@GetMapping("/rpvar")
public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
{
return paramdata;
}
}
Frapper les demandes suivantes, j'ai obtenu la même réponse:
! @ a été reçu comme réponse dans les deux demandes
il se peut que le type midia application / x-www-form-urlencoded convertisse l'espace en + , et le récepteur décodera les données en convertissant le + en space.check l'url pour plus d'informations. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
peut être utilisé dans n'importe quel RequestMethod