Перейти к основному содержимому

Spring @RequestParam против @PathVariable Аннотации

· 2 мин. чтения

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 .