415 Stimmen

@RequestParam vs. @PathVariable

Was ist der Unterschied zwischen @RequestParam y @PathVariable bei der Behandlung von Sonderzeichen?

+ wurde angenommen von @RequestParam als Raum.

Im Fall von @PathVariable , + wurde angenommen als + .

560voto

Ralph Punkte 114913

Wenn die URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 die Rechnungen für den Benutzer 1234 am 5. Dezember 2013 erhält, würde die Controller-Methode wie folgt aussehen:

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

Außerdem können Abfrageparameter optional sein, und ab Spring 4.3.3 können Pfadvariablen kann auch optional sein . Beachten Sie jedoch, dass sich dadurch die URL-Pfadhierarchie ändern und Konflikte bei der Zuordnung von Anfragen auftreten können. Zum Beispiel, würde /user/invoices die Rechnungen für die Nutzer bereitstellen null oder Details über einen Benutzer mit der ID "Rechnungen"?

131voto

Xelian Punkte 15760

@RequestParam Anmerkung, die für den Zugriff auf die Werte der Abfrageparameter aus der Anfrage verwendet wird. Sehen Sie sich die folgende Anfrage-URL an:

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

In der obigen URL-Anfrage kann auf die Werte für param1 und param2 wie folgt zugegriffen werden:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

Im Folgenden sind die Parameter aufgeführt, die von der @RequestParam-Annotation unterstützt werden:

  • defaultValue - Dies ist der Standardwert als Fallback-Mechanismus, wenn die Anfrage den Wert nicht enthält oder leer ist.
  • Name - Name des zu bindenden Parameters
  • erforderlich - Ob der Parameter obligatorisch ist oder nicht. Wenn er wahr ist, schlägt die Übermittlung dieses Parameters fehl.
  • Wert - Dies ist ein Alias für das Attribut name

@PfadVariable

@ PfadVariable identifiziert das Muster, das im URI für die eingehende Anfrage verwendet wird. Schauen wir uns die unten stehende Anfrage-URL an:

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

Die obige URL-Anforderung kann in Ihrem Spring MVC wie folgt geschrieben werden:

@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){
.......
}

Die @ PfadVariable Annotation hat nur einen Attributwert für die Bindung der Anfrage-URI-Vorlage. Es ist erlaubt, die mehreren @ PfadVariable Anmerkung in der einzelnen Methode. Achten Sie aber darauf, dass nicht mehr als eine Methode das gleiche Muster hat.

Außerdem gibt es eine weitere interessante Anmerkung: @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

Und die Controller-Methode dafür

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

Aber Sie müssen es ermöglichen:

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

37voto

alok Punkte 2618

@RequestParam wird für Abfrageparameter (statische Werte) wie: http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable wird für dynamische Werte wie : 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;
}

37voto

Andriy Punkte 1651

1) @RequestParam wird verwendet, um die Abfrageparameter

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

während @PathVariable wird verwendet, um Daten direkt aus dem URI zu extrahieren:

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 ist nützlicher für eine traditionelle Webanwendung, bei der die Daten meist in den Abfrageparametern übergeben werden, während @PathVariable ist besser geeignet für RESTful-Webdienste, bei denen die URL Werte enthält.

3) @RequestParam Annotation kann angeben Standardwerte wenn ein Abfrageparameter nicht vorhanden oder leer ist, indem er eine defaultValue Attribut, sofern das erforderliche Attribut 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";
    }

}

1voto

andy Punkte 3531

Kann es sein, dass der Typ application/x-www-form-urlencoded midia Leerzeichen in + und der Empfänger dekodiert die Daten durch Umwandlung der + in den Weltraum. Weitere Informationen finden Sie unter der URL. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X