@RequestParam vs @PathVariable


355

Quelle est la différence entre @RequestParamet @PathVariablelors de la gestion des caractères spéciaux?

+a été accepté par @RequestParamcomme espace.

Dans le cas de @PathVariable, a +été accepté comme +.

Réponses:


499

Si l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013reç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/invoicesfournirait les factures de l'utilisateur nullou des détails sur un utilisateur avec un ID "factures"?


11
@PathVariablepeut être utilisé dans n'importe quel RequestMethod
Kurai Bankusu

1
@AlexO: cela n'a rien à voir avec java8, cela fonctionne même pour java 5 et Spring3.0: Le fait est que le code est compilé avec le débogage activé.
Ralph

2
@Ralph Correct, cela fonctionne avec le débogage avant Java 8. Depuis Java 8, cela fonctionne également sans débogage, à la place en utilisant "-parameters": docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / tutorial / réfléchir / membre /…
AlexO

1
@ user3705478: je ne pense pas, car le printemps a besoin de savoir qu'il s'agit d'une méthode de gestion des requêtes. (et bien sûr: @PathParam ne fonctionne que s'il y a un espace réservé dans le modèle uri)
Ralph

2
@ user3705478: @PathParamest une annotation javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

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&param2=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:

  • defaultValue - Il s'agit de la valeur par défaut en tant que mécanisme de secours si la demande n'a pas la valeur ou si elle est vide.
  • name - Nom du paramètre à lier
  • required - Indique si le paramètre est obligatoire ou non. S'il est vrai, l'échec de l'envoi de ce paramètre échouera.
  • value - Il s'agit d'un alias pour l'attribut name

@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

http: // localhost: 8080 / spring_3_2 / matrixvars / stocks; BT.A = 276,70, + 10,40, + 3,91; AZN = 236,00, + 103,00, + 3,29; SBRY = 375,50, + 7,60, + 2,07

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" >

Est-ce qu'une chaîne, par exemple, userNameaura un type param ou non? Je penche pour en faire une variable, mais cela pourrait aussi être un paramètre.
cst1992

1

Peut @PathParamet @RequestParamêtre déclaré sans utiliser@RequestMapping
sofs1

29

@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;
}

@alok simple et clair
anand krish

12

1) @RequestParamest 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 @PathVariableest 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) @RequestParamest plus utile sur une application Web traditionnelle où les données sont principalement transmises dans les paramètres de requête, tandis qu'elle @PathVariableconvient mieux aux services Web RESTful où l'URL contient des valeurs.

3) l' @RequestParamannotation 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 defaultValueattribut, à 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";
    }

}

1
@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) {

}

1

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:

  1. localhost: 7000 / pvar /! @ # $% ^ & * () _ + - = [] {} |; ': ",. / <>?
  2. localhost: 7000 / rpvar? param =! @ # $% ^ & * () _ + - = [] {} |; ': ",. / <>?

! @ a été reçu comme réponse dans les deux demandes


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.