spring - 如何为 WebClient 设置基本 url 和查询参数?
问题描述
在我的服务中,我必须从一些带有参数的不同 url 获得响应。
- 从http://a.com:8080/path1?param1=v1获取
- 从http://b.com:8080/path2?param2=v2获取
- 从http://c.com:8080/path3?param3=v3获取
我正在使用 WebClient 来完成以下工作。
public class WebClientTest {
private WebClient webClient = WebClient.builder().build();
@Test
public void webClientTest() {
Mono<String> a = webClient.get()
.uri(uriBuilder -> uriBuilder.scheme("http").host("a.com").port(8080).path("/path1")
.queryParam("param1", "v1")
.build())
.retrieve()
.bodyToMono(String.class);
Mono<String> b = webClient.get()
.uri(uriBuilder -> uriBuilder.scheme("http").host("b.com").port(8080).path("/path2")
.queryParam("param2", "v2")
.build())
.retrieve()
.bodyToMono(String.class);
Mono<String> c = webClient.get()
.uri(uriBuilder -> uriBuilder.scheme("http").host("c.com").port(8080).path("/path3")
.queryParam("param3", "v3")
.build())
.retrieve()
.bodyToMono(String.class);
//zip the result
}
}
如您所见,我必须一次又一次地分别设置方案、主机、端口。
所以我的问题是:
1. 我是否以正确的方式使用 WebClient?
2. 一个方法中是否可以同时设置scheme、host、port?我知道这webClient.get().uri("http://a.com:8080/path1?param1=v1").retrieve()
行得通,但我期待的是:
webClient.get()
.uri(uriBuilder -> uriBuilder/*.url("http://a.com:8080/path1")*/
.queryParam("param1", "v1")
.build())
.retrieve()
.bodyToMono(String.class);
解决方案
从 Spring Framework 5.2 开始,还有一个额外的方法可以帮助您解决特定情况:
Mono<String> response = this.webClient
.get()
.uri("http://a.com:8080/path1", uri -> uri.queryParam("param1", "v1").build())
.retrieve()
.bodyToMono(String.class);
WebClient
作为一般规则,我不建议为每个主机创建一个。这实际上取决于您的用例。在这里,您的客户端似乎可能会向许多主机发送请求,并且在这里创建许多 HTTP 客户端可能有点浪费。
推荐阅读
- html - 尝试将 HTML 元素对角对齐并使它们都具有相同的大小
- webpack - 如何使用 html-webpack-plugin 从 .pug 模板加载资产
- apache-spark - Spark 流不从 Kinesis 读取数据
- python - 在 Python 中从数据框中提取字符串
- excel - 验证文本框条目中的日期格式
- python - 通过 Python 代码登录 SAP GUI 时如何检查错误
- selenium-webdriver - selenium webdriver 在抛出 NoSuchElementException 之前的默认等待时间是多少
- java - OpenJdk 初始启动时间很慢
- java - 如何使用@Path 设置休息网址(获取查看文件的链接)
- javascript - 在 setState() 之后,更新的状态不会作为道具传递给组件