如何在 Java HTTP 客户端中设置套接字超时
How to set socket timeout in Java HTTP Client
我们想将所有 apache-httpclient-4.x 代码迁移到 java-http-client 减少依赖的代码。在迁移它们时,我 运行 进入 java 11 下的以下问题:
如何在Java HTTP 客户端中设置套接字超时?
使用 apache-httpclient-4.x 我们可以像这样设置连接超时和套接字超时:
DefaultHttpClient httpClient = new DefaultHttpClient();
int timeout = 5; // seconds
HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);
使用 java-http-client 我只能像这样设置连接超时:
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build()
但是我找不到设置套接字超时的方法。将来有什么方法或未解决的问题来支持它吗?
您可以通过timeout方法在HttpRequest.Builder
级别指定它:
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create("..."))
.timeout(Duration.ofSeconds(5)) //this
.build();
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
如果您已成功连接但无法在所需时间内收到响应,则会抛出 java.net.http.HttpTimeoutException: request timed out
(与 java.net.http.HttpConnectTimeoutException: HTTP connect timed out
不同,如果您没有'连接成功)。
我们想将所有 apache-httpclient-4.x 代码迁移到 java-http-client 减少依赖的代码。在迁移它们时,我 运行 进入 java 11 下的以下问题:
如何在Java HTTP 客户端中设置套接字超时?
使用 apache-httpclient-4.x 我们可以像这样设置连接超时和套接字超时:
DefaultHttpClient httpClient = new DefaultHttpClient();
int timeout = 5; // seconds
HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);
使用 java-http-client 我只能像这样设置连接超时:
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build()
但是我找不到设置套接字超时的方法。将来有什么方法或未解决的问题来支持它吗?
您可以通过timeout方法在HttpRequest.Builder
级别指定它:
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create("..."))
.timeout(Duration.ofSeconds(5)) //this
.build();
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
如果您已成功连接但无法在所需时间内收到响应,则会抛出 java.net.http.HttpTimeoutException: request timed out
(与 java.net.http.HttpConnectTimeoutException: HTTP connect timed out
不同,如果您没有'连接成功)。