You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Apache HttpClient 4.5(fluent接口)中设置全局默认超时?

Apache HttpClient 4.5 全局设置超时(含Fluent接口)

我来帮你搞定这个重复配置超时的麻烦!在HttpClient 4.5里,不管是普通的HttpClient实例还是便捷的Fluent接口,都能实现全局统一配置超时,不用每次发请求都重复写一遍参数。下面分两种场景详细说明:

一、普通HttpClient的全局超时配置

核心思路是创建一个带默认超时的RequestConfig,再把它绑定到HttpClient实例上,这样所有通过这个HttpClient发送的请求都会自动继承这个超时设置。

步骤示例:

  1. 构建全局的RequestConfig,设置连接超时、套接字超时,还有连接池获取连接的超时(这个也建议加上,避免在连接池满的时候无限等待):
import org.apache.http.client.config.RequestConfig;

// 定义超时时间,单位:毫秒
int connectionTimeout = 5000; // 连接建立超时
int socketTimeout = 10000;    // 数据传输超时
int connectionRequestTimeout = 3000; // 从连接池获取连接的超时

RequestConfig globalRequestConfig = RequestConfig.custom()
        .setConnectTimeout(connectionTimeout)
        .setSocketTimeout(socketTimeout)
        .setConnectionRequestTimeout(connectionRequestTimeout)
        .build();
  1. 用HttpClientBuilder把这个全局配置绑定到HttpClient实例:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

CloseableHttpClient httpClient = HttpClientBuilder.create()
        .setDefaultRequestConfig(globalRequestConfig)
        .build();

之后你用这个httpClient发送的所有请求,都会默认使用上面设置的超时时间。如果某个特殊请求需要不同的超时,也可以在请求级别覆盖:

import org.apache.http.client.methods.HttpGet;

HttpGet specialRequest = new HttpGet("https://example.com/special");
// 覆盖全局超时,设置专属超时
RequestConfig specialConfig = RequestConfig.copy(globalRequestConfig)
        .setSocketTimeout(20000)
        .build();
specialRequest.setConfig(specialConfig);

// 发送请求
httpClient.execute(specialRequest);

二、Fluent接口的全局超时配置

Fluent接口默认使用的是HttpClient的默认实例,所以要让Fluent请求都用我们自定义的带超时的HttpClient,才能实现全局配置。

方法1:每次请求指定自定义HttpClient

先按上面的步骤创建好带全局超时的httpClient,然后在Fluent请求里通过setHttpClient()指定它:

import org.apache.http.client.fluent.Request;

String response = Request.Get("https://example.com")
        .setHttpClient(httpClient)
        .execute()
        .returnContent()
        .asString();

方法2:封装工具类(更推荐)

为了避免每次都写setHttpClient(),可以封装一个工具类,直接返回已经绑定好自定义HttpClient的Fluent Request:

import org.apache.http.client.fluent.Request;

public class FluentHttpUtils {
    private static final CloseableHttpClient GLOBAL_HTTP_CLIENT;

    static {
        // 初始化全局HttpClient,配置超时
        RequestConfig globalConfig = RequestConfig.custom()
                .setConnectTimeout(5000)
                .setSocketTimeout(10000)
                .setConnectionRequestTimeout(3000)
                .build();
        GLOBAL_HTTP_CLIENT = HttpClientBuilder.create()
                .setDefaultRequestConfig(globalConfig)
                .build();
    }

    public static Request get(String url) {
        return Request.Get(url).setHttpClient(GLOBAL_HTTP_CLIENT);
    }

    // 同理可以封装Post、Put等方法
    public static Request post(String url) {
        return Request.Post(url).setHttpClient(GLOBAL_HTTP_CLIENT);
    }
}

之后用的时候直接调用工具类,不用再管超时配置:

String response = FluentHttpUtils.get("https://example.com")
        .execute()
        .returnContent()
        .asString();

同样,如果某个Fluent请求需要特殊超时,也可以在请求级别覆盖:

String specialResponse = FluentHttpUtils.get("https://example.com/special")
        .connectTimeout(2000) // 覆盖连接超时
        .socketTimeout(15000) // 覆盖套接字超时
        .execute()
        .returnContent()
        .asString();

内容的提问来源于stack exchange,提问作者DisplayName

火山引擎 最新活动