377 votes

@RequestParam vs @PathVariable

Quelle est la différence entre @RequestParam y @PathVariable tout en traitant les caractères spéciaux ?

+ a été accepté par @RequestParam comme espace.

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

527voto

Ralph Points 42744

Si l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 obtient les factures de l'utilisateur 1234 le 5 décembre 2013, la méthode du contrôleur ressemblerait à ceci :

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

De plus, les paramètres de requête peuvent être facultatifs et, à partir de Spring 4.3.3, les variables de chemin d'accès peut également être facultative . Attention toutefois, cela peut modifier la hiérarchie des chemins d'accès aux URL et introduire des conflits de mappage des requêtes. Par exemple, est-ce que /user/invoices fournir les factures pour l'utilisateur null ou des détails sur un utilisateur avec l'ID "factures" ?

12 votes

@PathVariable peut être utilisé dans n'importe quel RequestMethod

0 votes

Avec Java 8, le nom de la PathVariable est déduit du nom de l'argument, de sorte que la phrase ci-dessus peut être écrite comme suit : @PathVariable int userId

1 votes

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

120voto

Xelian Points 1006

@RequestParam utilisée pour accéder aux valeurs des paramètres de requête de la demande. Regardez l'URL de la requête suivante :

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

Dans la requête 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 :

  • Valeur par défaut - Il s'agit de la valeur par défaut comme mécanisme de repli si la demande n'a pas de valeur ou si elle est vide.
  • nom - Nom du paramètre à lier
  • requerido - Si le paramètre est obligatoire ou non. Si c'est vrai, l'envoi de ce paramètre échouera.
  • valeur - Il s'agit d'un alias pour l'attribut "nom".

@PathVariable

@ Variable de chemin identifie le modèle qui est utilisé dans l'URI pour la demande entrante. Examinons l'URL de la demande ci-dessous :

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

La requête URL ci-dessus peut être écrite dans votre Spring MVC 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){
.......
}

Le @ Variable de chemin n'a qu'une seule valeur d'attribut pour lier le modèle d'URI de la demande. Il est permis d'utiliser les multiples @ Variable de chemin dans la méthode unique. Mais, assurez-vous que pas plus d'une méthode ne possède le même motif.

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 permettre :

<mvc:annotation-driven enableMatrixVariables="true" >

0 votes

Est-ce qu'une chaîne de caractères, telle que userName ont un paramètre de type ou non ? Je penche pour une variable, mais ce pourrait aussi être un paramètre.

1 votes

Et voici le message original :-) javabeat.net/spring-mvc-requestparam-pathvariable

0 votes

Puede @PathParam y @RequestParam être déclaré sans utiliser @RequestMapping

31voto

alok Points 1136

@RequestParam est utilisé pour les paramètres de requête (valeurs statiques) comme : http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable est utilisé pour les valeurs dynamiques comme : http://localhost:8080/calculation/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;
}

21voto

1) @RequestParam est utilisé pour extraire paramètres de la 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);
}

tandis que @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 passées dans les paramètres de la requête alors que @PathVariable convient mieux aux services web RESTful dont l'URL contient des valeurs.

3) @RequestParam peut spécifier Valeurs par défaut si un paramètre de requête n'est pas présent ou vide, en utilisant une balise defaultValue à 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";
    }

}

0 votes

Votre argument 2 est-il basé sur une opinion ou pouvez-vous fournir une ressource qui soutient cette thèse ?

1voto

Mathew Menalish Points 31
@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) {

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X