Spring @RequestParam vs @PathVariable Annotations

1. Übersicht

In diesem kurzen Tutorial werden wir die Unterschiede zwischen den Annotationen @RequestParam und @PathVariable von Spring untersuchen .

@RequestParam und @PathVariable können beide verwendet werden, um Werte aus dem Anforderungs-URI zu extrahieren, sie unterscheiden sich jedoch etwas.

2. Abfrageparameter vs URI-Pfad

Während @RequestParam s Werte aus der Abfragezeichenfolge extrahiert , extrahiert @PathVariables Werte aus dem URI-Pfad:

@GetMapping("/foos/{id}") @ResponseBody public String getFooById(@PathVariable String id) { return "ID: " + id; }

Dann können wir basierend auf dem Pfad zuordnen:

//localhost:8080/foos/abc ---- ID: abc

Und für @RequestParam wird es sein:

@GetMapping("/foos") @ResponseBody public String getFooByIdUsingQueryParam(@RequestParam String id) { return "ID: " + id; }

Was uns die gleiche Antwort geben würde, nur eine andere URI:

//localhost:8080/foos?id=abc ---- ID: abc

3. Codiert gegen exakten Wert

Da @PathVariable Werte aus dem URI-Pfad extrahiert, wird es nicht codiert. Auf der anderen Seite ist @RequestParam .

Im vorherigen Beispiel gibt ab + c unverändert zurück:

//localhost:8080/foos/ab+c ---- ID: ab+c

Bei einer @ RequestParam- Anforderung ist der Parameter jedoch URL-decodiert:

//localhost:8080/foos?id=ab+c ---- ID: ab c

4. Optionale Werte

Sowohl @RequestParam als auch @PathVariable können optional sein.

Wir können @PathVariable optional machen, indem wir das erforderliche Attribut ab Spring 4.3.3 verwenden:

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"}) @ResponseBody public String getFooByOptionalId(@PathVariable(required = false) String id){ return "ID: " + id; }

Was wir also entweder tun können:

//localhost:8080/myfoos/optional/abc ---- ID: abc 

oder:

//localhost:8080/myfoos/optional ---- ID: null

Für @RequestParam können wir auch das erforderliche Attribut verwenden.

Beachten Sie, dass wir vorsichtig sein sollten, wenn Sie @PathVariable optional machen, um Konflikte in Pfaden zu vermeiden.

5. Schlussfolgerung

In diesem Artikel haben wir die Unterschiede zwischen @RequestParam und @PathVariable kennengelernt .

Den vollständigen Quellcode für die Beispiele finden Sie auf GitHub.