首页 > 解决方案 > WebClient 请求中的 timeout() 和 HttpClient 中的超时之间的区别

问题描述

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

  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));

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

Connect另外,第一个实现中的,ReadWriteTimeouts之间有什么区别HttpClient

标签: javaspringspring-bootreactive-programmingspring-webflux

解决方案


与 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


推荐阅读