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