簡體   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