如何在 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 不同,如果您没有'连接成功)。