@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 +.

user1857181
la source

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

Ralph
la source
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" >
Xelian
la source
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
..Et voici le message d'origine: - javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj Malik
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
la source
@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";
    }

}
Andriy
la source
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) {

}
Mathew Menalish
la source
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

Shubham Srivastava
la source