java - WebClient 请求中的 timeout() 和 HttpClient 中的超时之间的区别
问题描述
我试图调用一个服务,并想为它设置一个超时。我找到了两种方法可以做到这一点。
- 通过在全局中设置读写超时
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();
- 通过
timeout()
在请求中使用。
return webClient.get()
.uri("/someUri")
.retrieve()
.bodyToFlux(Foo.class)
.timeout(Duration.ofMillis(10_000));
实现和性能影响之间的主要区别是什么?
Connect
另外,第一个实现中的,Read
和Write
Timeouts之间有什么区别HttpClient
?
解决方案
与 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
推荐阅读
- php - 如何正确连接到 MySQL 数据库?
- javascript - JavaScript 通过链接更改输入值
- windows - 在运行时编辑 PowerShell 脚本
- django - 如何在 django 视图中更改 XML API 中的根和项目列表名称
- javascript - 拒绝启用位置弹出后反应本机错误
- mysql - 关系数据库:属性依赖于上下文的项目
- visual-c++ - Godot:编译的源项目无法在 Windows 10 中打开
- reactjs - React Redux 和 React Router 连接
- python - 如何将矩阵/二维数组写入文本文件python
- angular - VMWare Clarity 和 Angular 中的非模态向导