[英]Spring Boot - how to differentiate between validation for @PathVariable and query params (@RequestParam)
[英]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.