Jarné poznámky @RequestParam vs @PathVariable
1. Prehľad
V tomto rýchlom výučbe preskúmame rozdiely medzi jarnými @RequestParam a @PathVariable anotácie.
@RequestParam a @PathVariable obidve možno použiť na extrahovanie hodnôt z identifikátora URI požiadavky, sú však trochu odlišné.
2. Cesta parametra dopytu vs cesta URI
Zatiaľ čo @RequestParams extrahovať hodnoty z reťazca dotazu, @PathVariables extrahujte hodnoty z cesty URI:
@GetMapping ("/ foos / {id}") @ResponseBody public String getFooById (@PathVariable String id) {return "ID:" + id; }
Potom môžeme mapovať na základe cesty:
// localhost: 8080 / foos / abc ---- ID: abc
A pre @RequestParam, bude to:
@GetMapping ("/ foos") @ResponseBody public String getFooByIdUsingQueryParam (@RequestParam String id) {return "ID:" + id; }
Čo by nám dalo rovnakú odpoveď, len iný URI:
// localhost: 8080 / foos? id = abc ---- ID: abc
3. Kódovaná vs presná hodnota
Pretože @PathVariable extrahuje hodnoty z cesty URI, nie je kódovaná. Na druhej strane, @RequestParam je.
Pomocou predchádzajúceho príkladu ab + c vráti sa také, aké je:
// localhost: 8080 / foos / ab + c ---- ID: ab + c
Ale pre a @RequestParam požiadavka, parameter je dekódovaný URL:
// localhost: 8080 / foos? id = ab + c ---- ID: ab c
4. Nepovinné hodnoty
Oboje @RequestParam a @PathVariable môže byť voliteľné.
Môžeme vyrobiť @PathVariable voliteľné pomocou požadovaný atribút začínajúci na jar 4.3.3:
@GetMapping ({"/ myfoos / optional", "/ myfoos / optional / {id}"}) @ResponseBody public String getFooByOptionalId (@PathVariable (required = false) String id) {return "ID:" + id; }
Čo potom môžeme urobiť buď:
// localhost: 8080 / myfoos / optional / abc ---- ID: abc
alebo:
// localhost: 8080 / myfoos / voliteľné ---- ID: null
Pre @RequestParam, môžeme tiež použiť požadovaný atribút.
Poznač si to pri výrobe by sme mali byť opatrní @PathVariable voliteľné, aby sa zabránilo konfliktom v cestách.
5. Záver
V tomto článku sme sa dozvedeli rozdiely medzi @RequestParam a @PathVariable.
Celý zdrojový kód príkladov nájdete na GitHub.