【问题标题】:How to set Base URI to Spring WebClient如何将 Base URI 设置为 Spring WebClient
【发布时间】:2021-03-28 04:05:54
【问题描述】:

我正在尝试创建一个 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(本机方法)\r\n\tat

我不确定我需要在哪里更改,以便它开始指向基本 URI 而不是 localhost (127.0.0.1:12012)。 另一件事是,如果我在 API 调用中传递完全限定名称 (https://test.com/api/v1/user/1),那么它可以正常工作。

【问题讨论】:

    标签: spring-webflux spring-webclient


    【解决方案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())
                ...
    

    【讨论】:

      【解决方案2】:

      WebClient.UriSpec 中有两种方法可以提供帮助。

      interface UriSpec<S extends RequestHeadersSpec<?>> {
      
          S uri(String uri, Object... uriVariables);
      
          S uri(String uri, Map<String, ?> uriVariables);
      
          ...
      }
      

      在最简单的情况下,只需传递 String 而不是 URI 作为参数。

      String user = webClient
                      .get()
                      .uri("/api/v1/user/1")        // <- just String
                      .retrieve()
                      .bodyToMono(String.class)
                      .block();
      

      【讨论】:

        猜你喜欢
        • 2021-01-04
        • 2019-11-23
        • 2021-12-21
        • 2018-02-24
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 2018-08-06
        相关资源
        最近更新 更多