Tenho o endpoint abaixo:
/dashboards/view/{space}/{id}/{filter}
O fato é que o parâmetro filter pode ou não vir. Existe alguma forma de representar isso na string do endpoint?
Por exemplo, colocando colchetes, dessa forma:
/dashboards/view/{space}/{id}/[filter]
?
Ou terei que fazer um endpoint para cada ocasião?
Neste formato você está passando como variável de path, se você passar realmente como parâmetro na requisição, ele por si só já poderia existir ou não!
Exemplo:
/dashboards/view/{space}/{id}?filter=valor
/dashboards/view/{space}/{id}
eu pensei nisso, mas gostaria de saber se existe alguma maneira usando apenas variável de path.
Não, neste caso seriam duas rotas distintas, uma para quando houver filtro e outra para quando não houver filtro.
Dá pra fazer da seguinte forma:
@RestController
class MyController {
@GetMapping({ "/exemplo1/dashboards/view/{space}/{id}", "/exemplo1/dashboards/view/{space}/{id}/{filter}" })
String exemplo1(@PathVariable String space, @PathVariable int id, @PathVariable(required = false) String filter) {
return space + " | " + id + " | " + filter; // filter é null
}
@GetMapping({ "/exemplo2/dashboards/view/{space}/{id}", "/exemplo2/dashboards/view/{space}/{id}/{filter}" }) // @formatter:off
String exemplo2(@PathVariable String space, @PathVariable int id, @PathVariable Optional<String> filter) {
return space + " | " + id + " | " + filter.orElse("sem filtro");
}
}
No exemplo 1 o valor de filter será null por padrão e no segundo exemplo, usando Optional vc pode escolher o valor usado quando filter não estiver presente.
Este artigo mostra outras formas de fazer: https://www.baeldung.com/spring-optional-path-variables