java - 如何在spring boot中区分名称相同但查询参数不同的edpoints
问题描述
我是 Spring Boot 的新手,并试图用一些资源制作一个 Rest API,我有以下内容:
获取所有现有规则:
@GetMapping("/rules")
@ResponseStatus(HttpStatus.OK)
@ApiOperation(value = "Get all the existing rules", response = RuleViewModel.class) //Swagger documentation
public ResponseEntity<Page<RuleViewModel>> get(@PageableDefault(page = 0, size = 25) Pageable pageable) {
Page<Rule> rulesEntity = ruleService.findByDeletedIsSend(false, pageable);
Page<RuleViewModel> ruleViewModels = rulesEntity.map(mapper::ruleViewModelMapper);
return new ResponseEntity<>(ruleViewModels, HttpStatus.OK);
}
使用不同的参数过滤所有现有规则
@GetMapping(value = "/rules")
@ResponseStatus(HttpStatus.OK)
@ApiOperation(value = "Get a specific rule by filter", response = RuleViewModel.class)
public ResponseEntity<Page<RuleViewModel>> getByFilter(
@RequestParam(name = "id", required = false) Optional<String> ruleId,
@RequestParam(name = "description", required = false) Optional<String> description,
@RequestParam(name = "types", required = false) Optional<List<Boolean>> types,
@RequestParam(name = "layers", required = false) Optional<List<Layer>> layers,
@RequestParam(name = "groups", required = false) Optional<List<Category>> groups,
Pageable pageable
) {
Page<Rule> rulesEntities = ruleService
.filterRule(
types.orElse(Arrays.asList(true, false)),
layers.orElse(layerService.findByIsActive(true)),
groups.orElse(categoryService.findByIsActive(true)),
description.orElse(""),
ruleId.orElse(""),
false,
pageable
);
Page<RuleViewModel> ruleViewModels = rulesEntities.map(mapper::ruleViewModelMapper);
return ruleViewModels.getSize() > 0 ? new ResponseEntity<>(ruleViewModels, HttpStatus.OK) : new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
如您所见,路径是相同的(“/rules”),但在过滤器的情况下,它添加了所有可选参数。
我遇到的问题是,当我想使用过滤器参数时:
http://localhost:5656/v1/rules?id=7be4336d-6495-5b71-9bc2-a97c9da5ede2
它总是去获取所有规则端点。
我所做的解决方法是将“搜索”路径添加到 URI,如下所示:
http://localhost:5656/v1/rules/search?id=7be4336d-6495-5b71-9bc2-a97c9da5ede2
所以请求得到正确映射,但我认为它违反了 Rest 最佳实践。
你能指出我实现这一目标的正确方法吗?提前致谢。
解决方案
既然这两个方法具有相同的返回类型,并且 getByFilter 方法的所有参数都是可选的,那么为什么不删除 getByFilter 方法并将参数作为可选参数添加到 get 方法中呢?如果传入任何可选参数,则 get 方法可以执行过滤逻辑,否则返回完整的响应而不进行任何过滤。
推荐阅读
- saml - samltool 返回 IDP_CERT_OR_FINGERPRINT_NOT_FOUND_AND_REQUIRED
- python - 无法 pip 安装 mysql
- java - Spring - 将存储库自动装配到服务中时出现 NoSuchBeanDefinitionException
- c# - 在 C# 中抽象 DbContext 实现
- regex - 如何使用预定义的字符类和前瞻来制作正则表达式模式?
- java - 在 IntelliJ IDEA 中设置 JDK 10:所选目录不是 JDK 的有效主目录
- amazon-web-services - AWS EC2 实例中的自发关闭
- c++ - 在 QLineEdit 中显示和编辑转义字符
- visual-studio-2017 - 未找到导入的项目“C:\Program Files\dotnet\sdk\2.1.201\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets”
- c# - LINQ 从第一个列表中选择