Рубрики
Без рубрики

Spring @RequestParam vs @PathVariable Аннотации

Поймите различия между аннотациями @RequestParam и @PathVariable Spring.

Автор оригинала: baeldung.

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 .