繁体   English   中英

具有不同查询参数类型的Spring REST端点

[英]Spring REST endpoint with varying query parameter type

我想知道如何在Spring Boot中实现REST端点,以便它将基于两个条件返回对象列表,这将是值列表或单词“ ALL”。

例如:我想检索来自任何给定国家的用户列表(我想提供一个字符串型国家代码列表作为查询参数)并且属于任何给定组的一部分(我提供一个列表)组的长型ID。 看起来像这样:

 @GetMapping("users")
public List<UserDto> findUsers(
        @RequestParam("countries") List<String> countryCodes,
        @RequestParam("groupIds") List<Long> groupsIds) {
    return matchingService.findMatchingUsersBy(groupIds, countryCodes);
}

然后,我的请求将如下所示:

/v1/users?countries=US,UK,GE&groupIds=1,4,5,6

现在,如果我希望当一个或两个参数都为“ ALL”时也能使它工作,就像这样:

/v1/users?countries=ALL&groupIds=ALL 
/v1/users?countries=UK,FR&groupIds=ALL
/v1/users?countries=ALL&groupIds=1,2,3

这里的期望是应用程序将从数据库中获取所有可能的值并基于该值进行搜索。

我很确定我会得到一个例外,说“ ALL”不是列表groupId的有效Long值。

有没有一种方法可以基于不同的查询参数类型为同一终结点提供不同的实现? 什么是最干净的方法?

当您要根据特定的国家/地区代码和组ID检索数据时,无需传递任何内容,只需将requestParams设为可选并在代码上进行处理即可。

 @GetMapping("users")
 public List<UserDto> findUsers(
    @RequestParam("countries", required = false) List<String> countryCodes,
    @RequestParam("groupIds", required = false) List<Long> groupsIds) {
if(countryCodes == null){
    countryCodes = fetchCountryCodeFromRepo();
}
if(groupIds == null){
    groupIds = fetchGroupIdsFromRepo();
}
return matchingService.findMatchingUsersBy(groupIds, countryCodes);
}

最简单的解决方案是传递String ALL,而Controller中的第一行应该是:

List<String> countries;
if(countryCodes.contains("ALL")) {
  List<String> countries = countryRepository.findAll();
} else {
  countries = countryCodes;
}
matchingService.findMatchingUsersBy(groupIds, countries);

另外,您可以将@RequestParam(required = false)因此,如果您收到的是null而不是groupIds那么您知道应该包括所有组。 但是,这也是如此定制。 此API的客户端将不确定向api发送任何内容是否意味着“所有组”中的“所有组”。 如果使用“全部”解决方案或“不需要”解决方案,则必须对其进行很好的记录。 如果您的用例允许,最干净的方法是在需要的国家或组列表中发送100个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM