Несколько конечных точек для REST API в Springboot - PullRequest
1 голос
/ 27 января 2020

У меня есть два уникальных ключа в таблице id , userId . Я должен создать REST API весной, чтобы получить информацию о пользователе, если любой из двух ключей задан как переменная пути.

Задача здесь заключается в том, что нам нужно создать две разные конечные точки для получения пользователя через id и получение пользователя через userId , но используйте один и тот же метод для обоих. Также тип данных id равен long , а тип данных userId равен String в таблице

Так что я пытаюсь сделать следующий

конечная точка "/ user / {id}" предназначена для userId

@RequestMapping(value = {"/{id}","/user/{id}"}, method=RequestMethod.GET)
public response getUser(@PathVariable("id") String id){

}

Но я не могу понять, как проверить, получил ли я id или userId внутри метода. И это правильный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Вы можете сделать это одним способом:

@RequestMapping(value = {"/{id}", "/user/{userId}"}, method = RequestMethod.GET)
public void getUser(@PathVariable(value = "id", required = false) String id,
  @PathVariable(value = "userId", required = false) Long userId) {
    if (id != null) {
    //TODO stuff for id
   }
   if (userId != null) {
    //TODO stuff for userId
   }

}

1 голос
/ 27 января 2020

Разве вы не можете реорганизовать базу данных, чтобы иметь только один идентификатор? Это проясняет ситуацию и обеспечивает чистоту кода.

Если это невозможно, вы можете создать 2 метода со значимыми именами.

// handles: /user/{entityId}
@RequestMapping(value = "/user/{entityId}", method=RequestMethod.GET)
public UserDto getUserByEntityId(@PathVariable("entityId") long entityId){
   // call service 
}

// handles: /user?userId={userId}
@RequestMapping(value = "/user", method=RequestMethod.GET)
public UserDto getUserByUserId(@RequestParam("userId", required=true) String userId){
   // call service 
}

Вы можете обсудить правильные имена / подписи методов.

Еще одним преимуществом этого подхода является то, что вы можете добавлять аннотации Swagger do c к каждому из их.

1 голос
/ 27 января 2020

Я бы использовал @RequestMapping Несколько путей, сопоставленных с одной и той же возможностью метода контроллера таким образом.

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

Кроме того, подпись getUserById() неоднозначна. То, что параметр id означает id или userId

Наличие двух отдельных методов для того, что вы хотите получить, было бы более эффективным, если бы вы обрабатывали каждый случай правильно. Внутри каждого метода контроллера вы можете использовать общий лог c для двух, если хотите.

@RequestMapping(value = "/user/{userId}", method=RequestMethod.GET)
public String getUserById(@PathVariable("userId") String userId){
   // Common login
}

@RequestMapping(value = "/id", method=RequestMethod.GET)
public String getUserByUserId(@PathVariable("userId") String userId){
   // Common login
}

Вы можете даже реализовать для каждой конечной точки валидаторы, чтобы проверить, является ли ваш @PathVariable действительным или нет в случае Long или String

Вот некоторые ссылки ref1 , ref2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...