首页 > 解决方案 > 在构建 URIComponents 后添加查询参数

问题描述

我正在使用 UriComponentsBuilder 创建我的 GET 请求端点,它工作正常。

但我试图让它可重用,这样我就可以传入尽可能多的请求参数和
路径变量,而不会限制它。这对于路径变量来说很好,因为我
可以在 buildAndExpand 中传递尽可能多的参数作为映射。
但是我怎么能为请求参数做呢?请指教。

这是我目前正在做的,但这是不可重复使用的。

  public Map get(String a, String b, String c, String d, String e) {

    String url = "domain.com/get/{a}/{b}";

    String endPoint = UriComponentsBuilder.fromHttpUrl(url)
            .queryParam("c" ,c)
            .queryParam("d" ,d)
            .queryParam("e" ,e)
            .buildAndExpand(
                    new HashMap<String, String>() {{
                      put("a", a);
                      put("b", b);
                    }}
            ).toUriString();

    return restTemplate.getForEntity(endPoint, Map.class);
  }

我想将端点创建作为单独的方法拉出,如下所示。

  private UriComponents getUriComponent(String url, Map<String, String> params) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
    return builder.buildAndExpand(params);
  }

这适用于路径参数 a 和 b。但是我怎样才能在这里为 b,c,e 接受一个参数,这些参数也是查询参数。或其他一些保持动态的建议。因此,我可以为一个请求传入 5 个 queryParam,为另一个请求传入 10 个 queryParam,而无需每次都重写 UriComponentsBuilder。

请注意,最好不要网址修改为喜欢以下内容。

String url = "domain.com/get/{a}/{b}?c={c}&d={d}&e={e}";

标签: javaspringspring-boot

解决方案


因此,使用UriComponentsBuilder您可以向 URL 添加新参数。

String old = UriComponentsBuilder.newInstance()
        .scheme("http")
        .host("localhost")
        .queryParam("a", "b")
        .build()
        .toUriString();
// probably other method
String res = UriComponentsBuilder
        .fromHttpUrl(old)
        .queryParam("new", "new")
        .build()
        .toUriString();

System.out.println(res); // output: http://localhost?a=b&new=new

如果您需要添加存储在 a 中的参数Map,请创建一个实例org.springframework.util.MultiValueMap并调用queryParamsreplaceQueryParams根据您的需要添加参数或替换参数。

// I've changed method signature to accept Map<String, List<String>>, but you can leave just String and wrap String to a singleton list
private UriComponents getUriComponent(String url, Map<String, List<String>> params) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
            .queryParams(new LinkedMultiValueMap<>(params));
    return builder.build();
}

推荐阅读