繁体   English   中英

如何在 spring 引导中区分具有相同名称但不同查询参数的 edpoint

[英]How to differentiate edpoints with the same name but different query params in spring boot

我是 spring 引导的新手,并尝试使用一些资源制作 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 方法可以执行过滤逻辑,否则返回完整的响应而不进行任何过滤。

暂无
暂无

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

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