首页 > 其他分享 >HttpClient 和 HttpGet 都设置了,setConnectTimeout 和 setReadTimeout/setSocketTimeout,那么最终生效的是哪个配置?

HttpClient 和 HttpGet 都设置了,setConnectTimeout 和 setReadTimeout/setSocketTimeout,那么最终生效的是哪个配置?

时间:2024-09-13 10:01:59浏览次数:7  
标签:HttpGet 请求 setSocketTimeout 设置 setConnectTimeout 超时 全局 HttpClient

在使用 Apache HttpClient 时,如果你分别在 HttpClientHttpGet(或其他请求对象)上都设置了 setConnectTimeoutsetReadTimeout(也叫 setSocketTimeout),那么最终生效的配置是 HttpGet(或请求对象)的配置优先,即请求对象上的超时设置会覆盖全局 HttpClient 的设置。

具体规则说明:

  • HttpClient 设置的超时

    • 当你在 HttpClient 实例上设置超时(如 setConnectTimeoutsetReadTimeout),这是全局默认配置。它适用于使用这个 HttpClient 发送的所有 HTTP 请求,除非在具体的请求上覆盖该设置。
  • HttpGet(或其他请求对象)设置的超时

    • 如果你在 HttpGetHttpPost 等请求对象上单独设置了超时,它将覆盖 HttpClient 的全局默认超时配置,适用于该请求。

因此,如果你在 HttpClientHttpGet 上都设置了超时配置,请求级别的设置(即 HttpGet 的设置)会优先生效

代码示例:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;

public class HttpClientTimeoutExample {
    public static void main(String[] args) throws Exception {
        // 全局 HttpClient 设置(全局默认超时配置)
        RequestConfig globalConfig = RequestConfig.custom()
                .setConnectTimeout(5000)          // 连接超时5秒
                .setSocketTimeout(10000)          // 读取超时10秒
                .build();

        CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultRequestConfig(globalConfig)
                .build();

        // 针对 HttpGet 请求设置特定的超时(请求级别超时配置)
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(3000)          // 覆盖全局的连接超时为3秒
                .setSocketTimeout(5000)           // 覆盖全局的读取超时为5秒
                .build();

        HttpGet httpGet = new HttpGet("http://example.com");
        httpGet.setConfig(requestConfig);         // 应用请求级别的超时配置

        // 执行请求
        try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
            // 处理响应...
        }
    }
}

代码分析:

  1. 全局超时设置:我们在 HttpClient 上设置了全局默认的超时配置,连接超时为 5 秒,读取超时为 10 秒。
  2. 请求级别超时设置:我们在 HttpGet 对象上覆盖了这些超时设置,连接超时为 3 秒,读取超时为 5 秒。
  3. 优先级:由于在 HttpGet 上设置了超时,它将覆盖 HttpClient 的全局设置。因此,这个请求的实际超时是连接 3 秒,读取 5 秒。

总结:

  • 全局设置(通过 HttpClient 设置的超时)是默认配置,适用于所有请求。
  • 请求级别设置(如在 HttpGetHttpPost 中单独设置的超时)会优先级更高,覆盖全局设置。

标签:HttpGet,请求,setSocketTimeout,设置,setConnectTimeout,超时,全局,HttpClient
From: https://www.cnblogs.com/Will-Chang/p/18411684

相关文章