1. Обзор
В этом кратком руководстве мы рассмотрим различия между аннотациями Spring @RequestParam и @PathVariable .
@RequestParam и @PathVariable могут использоваться для извлечения значений из URI запроса, но они немного отличаются.
2. Параметр запроса и путь URI
В то время как @RequestParam s извлекает значения из строки запроса, @PathVariables извлекает значения из пути URI:
@GetMapping("/foos/{id}") @ResponseBody public String getFooById(@PathVariable String id) { return "ID: " + id; }
Затем мы можем составить карту на основе пути:
http://localhost:8080/foos/abc ---- ID: abc
И для @RequestParam, это будет:
@GetMapping("/foos") @ResponseBody public String getFooByIdUsingQueryParam(@RequestParam String id) { return "ID: " + id; }
Что дало бы нам тот же ответ, только другой URI:
http://localhost:8080/foos?id=abc ---- ID: abc
3. Кодированное и точное значение
Поскольку @PathVariable извлекает значения из пути URI, он не закодирован. С другой стороны, @RequestParam есть.
Используя предыдущий пример, ab+c вернет как есть:
http://localhost:8080/foos/ab+c ---- ID: ab+c
Но для a @RequestParam запрос, параметр декодируется URL:
http://localhost:8080/foos?id=ab+c ---- ID: ab c
4. Необязательные значения
Оба @RequestParam и @PathVariable может быть необязательным.
Мы можем сделать @PathVariable необязательным, используя атрибут required , начиная с Spring 4.3.3:
@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"}) @ResponseBody public String getFooByOptionalId(@PathVariable(required = false) String id){ return "ID: " + id; }
Что, в таком случае, мы можем сделать либо:
http://localhost:8080/myfoos/optional/abc ---- ID: abc
или:
http://localhost:8080/myfoos/optional ---- ID: null
Для @RequestParam мы также можем использовать атрибут required .
Обратите внимание, что мы должны быть осторожны, делая @PathVariable необязательным, чтобы избежать конфликтов в путях.
5. Заключение
В этой статье мы узнали о различиях между @RequestParam и @PathVariable .
Полный исходный код примеров можно найти на GitHub .