java - 在构建 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}";
解决方案
因此,使用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
并调用queryParams
或replaceQueryParams
根据您的需要添加参数或替换参数。
// 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();
}
推荐阅读
- javascript - 添加 normalScrollElements 取决于屏幕大小
- c - 如何最好地与动态加载的库共享 main 中的全局计算?
- html - 如何在多个相互覆盖的 HTML 元素上触发鼠标单击事件?
- c# - 选择行时gridview中按钮的可见性ASP.net c#
- javascript - nodeJS:TypeError:将循环结构转换为 JSON
- python - 使用 pandas pd.concat 后丢失的列
- node.js - 如何保存用户然后保存上传图片
- regex - 正则表达式与转义括号不匹配
- encryption - 如何使用 BCryptPasswordEncoder 解码密码?
- python - 在 Python 3.7 中,来自 sys.settrace 的“操作码”事件是否提供有关字节码本身的任何信息?