在Spring Boot中使用Apache HttpClient封装请求工具类?

在Spring Boot中使用Apache HttpClient封装请求工具类?

经验文章nimo972025-03-02 19:02:4312A+A-

在微服务架构中,应用之间的通信通常依赖于HTTP协议。而在Spring Boot项目中也需要通过HTTP协议与外部服务或其他微服务进行交互,虽然Spring Boot自带了一些HTTP客户端,但是在一些特定场景下还是需要依赖外部客户端进行调用,下面我们就来看看如何在Spring Boot中整合Apache HttpClient来封装一个通用的HTTP请求工具类,以便在项目中进行灵活、统一的HTTP请求管理。

引入Apache HttpClient依赖

首先,需要在Spring Boot项目中引入Apache HttpClient的相关依赖。在pom.xml中添加如下的配置依赖。


    
    
        org.apache.httpcomponents
        httpclient
        4.5.13 
    
    
    
        org.springframework.boot
        spring-boot-starter-web
    

接下来配置Apache HttpClient

配置Apache HttpClient

创建一个HttpClient实例,然后对这个实例进行配置,这里我们创建一个配置类,来对HttpClient实例进行配置,例如配置连接池、配置请求超时时间、配置请求重试操作等等。

@Configuration
public class HttpClientConfig {

    @Bean
    public CloseableHttpClient httpClient() {
        // 连接池管理
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(200); // 最大连接数
        connectionManager.setDefaultMaxPerRoute(20); // 每个路由最大连接数

        // 设置重试策略
        RetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true); // 最大重试次数为3

        // 自定义HttpClient
        return HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setRetryHandler(retryHandler)
                .build();
    }
}

在这个配置类中,我们添加了连接池的配置、添加了重试策略的配置,最终通过HttpClients.custom()方法来创建一个自定义的CloseableHttpClient示例并注册到容器中。

创建HTTP请求工具类

配置完成之后,接下来就是创建一个通用的HTTP请求工具类,通过这个统一的配置类来化简HTTP请求的发送和响应处理操作,如下所示。

@Component
public class HttpClientUtil {

    private final CloseableHttpClient httpClient;

    @Autowired
    public HttpClientUtil(CloseableHttpClient httpClient) {
        this.httpClient = httpClient;
    }

    // 发起GET请求
    public String doGet(String url) throws IOException {
        HttpGet httpGet = new HttpGet(url);
        try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
            return handleResponse(response);
        }
    }

    // 发起POST请求
    public String doPost(String url, Map headers, String body) throws IOException {
        HttpPost httpPost = new HttpPost(url);
        // 设置请求头
        if (headers != null) {
            headers.forEach(httpPost::setHeader);
        }
        // 设置请求体
        if (body != null) {
            httpPost.setEntity(new StringEntity(body, ContentType.APPLICATION_JSON));
        }
        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
            return handleResponse(response);
        }
    }

    // 通用的响应处理方法
    private String handleResponse(CloseableHttpResponse response) throws IOException {
        HttpEntity entity = response.getEntity();
        return EntityUtils.toString(entity);
    }
}

这个工具类提供了GET和POST两种常用请求方式,我们可以根据需求进一步扩展它,支持PUT、DELETE等HTTP方法。

使用HttpClientUtil发送请求

这个时候,我们就可以在Spring Boot服务中使用HttpClientUtil来发送HTTP请求消息,如下所示。

@RestController
public class DemoController {

    private final HttpClientUtil httpClientUtil;

    @Autowired
    public DemoController(HttpClientUtil httpClientUtil) {
        this.httpClientUtil = httpClientUtil;
    }

    @GetMapping("/getExample")
    public String getExample(@RequestParam String url) throws IOException {
        return httpClientUtil.doGet(url);
    }

    @GetMapping("/postExample")
    public String postExample(@RequestParam String url, @RequestParam String body) throws IOException {
        return httpClientUtil.doPost(url, null, body);
    }
}

在这个Controller类中,我们通过HttpClientUtil来发送GET和POST请求。/getExample和/postExample两个接口展示了如何调用工具类的doGet和doPost方法。

总结

本文介绍了如何在Spring Boot项目中集成Apache HttpClient,然后将请求操作封装成了一个通用的请求工具类。通过这种方式来灵活的处理HTTP请求提供了更高的自定义性和控制操作,尤其是在需要优化性能、进行复杂配置或支持高级特性的场景中,Apache HttpClient是一个很好的选择。

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7