spring-webflux - 如何将 Base URI 设置为 Spring WebClient
问题描述
我正在尝试创建一个 Spring WebClient 来调用 rest API。为此,我编写了以下代码。
@Bean
public WebClient defaultWebClient() {
var tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3_000)
.doOnConnected(connection ->
connection.addHandlerLast(new ReadTimeoutHandler(3))
.addHandlerLast(new WriteTimeoutHandler(3)));
return WebClient.builder()
.baseUrl("https://test.com")
.clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.defaultHeader(HttpHeaders.ACCEPT, "application/vnd.api+json")
.build();
}
然后是带有以下代码的实际 URI。
String user = webClient
.get()
.uri(URI.create("/api/v1/user/1"))
.header("Authorization", TOKEN)
.header(HttpHeaders.ACCEPT, "application/json")
.retrieve()
.bodyToMono(String.class)
.block();
但是当上面的代码执行时,它会抛出以下异常。
{"timestamp":"1608209276546","level":"ERROR","thread":"http-nio-8080-exec-1","mdc":{"tenantId":null},"logger":" org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]","message":"Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出异常[请求处理失败;嵌套异常是 org.springframework.web.reactive.function.client.WebClientRequestException:连接被拒绝:没有更多信息:/127.0.0.1:12012;嵌套异常是 io.netty.channel.AbstractChannel$AnnotatedConnectException:连接拒绝:没有更多信息:/127.0.0.1:12012] 根本原因","context":"default","exception":"java.net.ConnectException:连接被拒绝:没有更多信息\r\n\tat java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)\r\n\tat
我不确定我需要在哪里更改,以便它开始指向基本 URI 而不是 localhost (127.0.0.1:12012)。另一件事是,如果我在 API 调用中传递完全限定名称( https://test.com/api/v1/user/1 ),那么它工作正常。
解决方案
来自 javadoc,方法uri(URI uri)
使用绝对的、完全构造的 URI 指定 URI
所以这个版本的方法不使用配置中的基本 url。
相反,您应该使用 UriBuilder 指定 URI,它被注入到方法uri(Function<UriBuilder,URI> uriFunction)中。
String user = webClient
.get()
.uri(uriBuilder -> uriBuilder.path("/api/v1/user/1").build())
...
推荐阅读
- oracle - 循环遍历固定的值列表
- r - ifelse 在 r 中的 mutate 函数中
- php - 删除行数据表后后续行的排序顺序
- ubuntu-16.04 - Ubuntu 16.04 的深色主题
- oracle - 运行函数中的 oracle-db 中的数据未更新
- javascript - 检查字符长度并在它太长时将其剪掉的函数
- android - 反正有没有使用应用程序包名称获取 android 应用程序图标、应用程序名称和应用程序描述?
- ipad - 启用 SplitView 和 MultiTask iPad 混合应用程序。丢弃交互
- javascript - 如果 HTML 容器包含特定元素,如何拆分它?
- python - 尝试对功能进行计时