Endpoint com ou sem Parâmetro

4 respostas
javaspring-boot
J

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?

4 Respostas

J

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}
J

eu pensei nisso, mas gostaria de saber se existe alguma maneira usando apenas variável de path.

J

Não, neste caso seriam duas rotas distintas, uma para quando houver filtro e outra para quando não houver filtro.

W

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

Criado 28 de outubro de 2020
Ultima resposta 28 de out. de 2020
Respostas 4
Participantes 3