【问题标题】:Difference between timeout() in WebClient request and the timeout in HttpClientWebClient 请求中的 timeout() 和 HttpClient 中的超时之间的区别
【发布时间】:2021-04-19 03:32:15
【问题描述】:

我试图调用一个服务,并想为它设置一个超时。我找到了两种方法可以做到这一点。

  1. 通过在HttpClient 中全局设置读写超时,然后在ClientHttpConnector 中使用它。
HttpClient httpClient = HttpClient.create()
                .tcpConfiguration(client ->
                        client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
                        .doOnConnected(c -> c
                                .addHandlerLast(new ReadTimeoutHandler(10))
                                .addHandlerLast(new WriteTimeoutHandler(10))));
         
        ClientHttpConnector conn = new ReactorClientHttpConnector(httpClient.wiretap(true));       
 
        return WebClient.builder()
                .baseUrl("http://localhost:8080")
                .clientConnector(conn)
                .build();
  1. 在请求中使用timeout()
return webClient.get()
        .uri("/someUri")
        .retrieve()
        .bodyToFlux(Foo.class)
        .timeout(Duration.ofMillis(10_000));

实现和性能影响之间的主要区别是什么?

还有ConnectReadWrite 在第一个实现与HttpClient 时的超时有什么区别?

【问题讨论】:

    标签: java spring spring-boot reactive-programming spring-webflux


    【解决方案1】:

    与 WebClient 相比,HtttClient 是具有附加功能的较新版本。这不是超时方法的差异,而是整个客户端系统的差异。准确地说,WebClient 让你的代码比 HttpClient 少。

    网络客户端

    .NET 中的 System.Net.WebClient 类在 HttpWebRequest 之上提供了高级抽象。 WebClient 只是 HttpWebRequest 的包装器,因此在内部使用 HttpWebRequest。因此,WebClient 与 HttpWebRequest 相比有点慢,但需要您编写更少的代码。您可以使用 WebClient 以简单的方式连接和使用 HTTP 服务。除非您需要利用 HttpWebRequest 提供的附加功能,否则它通常是比 HttpWebRequest 更好的选择。

    httpClient

    HttpClient 是在 .NET Framework 4.5 中引入的。对于使用 .NET 4.5 或更高版本的开发人员,这是使用 HTTP 请求的首选方式,除非您有特定的理由不使用它。本质上,HttpClient 结合了 HttpWebRequest 的灵活性和 WebClient 的简单性,为您提供两全其美的体验。

    HttpWebRequest 类提供了对请求/响应对象的大量控制。但是,您应该知道 HttpClient 从未设计为替代 WebClient。当您需要 HttpWebRequest 提供的附加功能时,您应该使用 HttpWebRequest 而不是 HttpClient。此外,与 WebClient 不同的是,HttpClient 缺乏对进度报告和自定义 URI 方案的支持。

    虽然 HttpClient 不支持 FTP,但模拟和测试 HttpClient 更容易。 HttpClient 中所有的 I/O 绑定方法都是异步的,您也可以使用同一个 HttpClient 实例进行并发请求。

    这里有一个链接可以帮助你更有效地理解它:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html

    【讨论】:

    • 我的问题与弹簧靴有关。不过感谢您的贡献。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2017-01-11
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多