@PathVariable vs @RequestParam для получения объекта - PullRequest
0 голосов
/ 29 мая 2020

Я знаю разницу между @PathVariable и @RequestParam, дело не в этом.

Я тоже читал несколько статей, но до сих пор не понимаю, когда использовать тот или иной в простой case.

Для REST API, допустим, у меня есть сущность User с id и username (оба уникальны).

Теперь я хочу получить пользователя с помощью имя пользователя.

У меня есть 2 варианта:

@GetMapping(path = "/users/{username}")
public ResponseEntity<Object> getUser(@PathVariable String username){
    //Get user
}

или

@GetMapping(path = "/users}")
public ResponseEntity<Object> getUser(@RequestParam String username){
    //Get user
}

Какой из них я должен использовать (@RequestParam не является обязательным в коде, я поместил для наглядности)?

Спасибо

1 Ответ

3 голосов
/ 29 мая 2020

Часть пути URL-адреса идентифицирует ресурс , а строка запроса представляет запрос . Хотя запрос, безусловно, может вернуть ровно один элемент, URL-адрес ресурса коллекции (/users) должен возвращать массив элементов (от нуля до бесконечности), а URL-адрес ресурса записи (/users/123) должен возвращать ровно один элемент (и это URL-адрес, который должен обрабатывать запросы DELETE / PUT).

Если username на самом деле является каноническим идентификатором для пользователя, это должен быть переменная пути; если существует другой канонический идентификатор (например, UUID), но вы выполняете поиск по имени пользователя, тогда используйте параметр запроса, но верните коллекцию из нуля или одного результата. (Вы можете использовать params=username в сопоставлении запроса, чтобы соответствовать контроллеру только при наличии этого параметра запроса.)

...