Soy nuevo en Spring Boot y trato de hacer una API Rest con algunos recursos, tengo lo siguiente:
Obtener todas las reglas existentes :
@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); }Filtrar todas las reglas existentes con diferentes parámetros
@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); }Como puedes ver la ruta es la misma ("/rules") pero en el caso de los filtros agrega todos los parámetros opcionales.
El problema que tengo es que cuando quiero usar parámetros de filtro como:
http://localhost:5656/v1/rules?id=7be4336d-6495-5b71-9bc2-a97c9da5ede2Siempre va a obtener el punto final de todas las reglas.
La solución que hice fue agregar la ruta de "búsqueda" al URI de esta manera:
http://localhost:5656/v1/rules/search?id=7be4336d-6495-5b71-9bc2-a97c9da5ede2
Entonces, las solicitudes se asignan correctamente, pero creo que viola las mejores prácticas de Rest.
¿Podría indicarme la forma correcta de lograr esto?. Gracias por adelantado.
Dado que ambos métodos tienen el mismo tipo de devolución y todos los parámetros del método getByFilter son opcionales, ¿por qué no elimina el método getByFilter y agrega los parámetros como parámetros opcionales al método get? El método get puede realizar la lógica de filtro si se pasa alguno de los parámetros opcionales; de lo contrario, devolver la respuesta completa sin ningún tipo de filtrado.