SpringBoot 7 种实现 HTTP 调用的方式

1. HttpClient

HttpClient是Apache基金会提供的一个用于发送HTTP请求的Java客户端库。

尽管它功能强大,但由于其API设计较为复杂且包体积庞大,在一些轻量级的应用场景中可能显得过于臃肿。

不过,在需要高度定制化的HTTP请求时,HttpClient依然是一个不错的选择。

java 复制代码
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

publicclassHttpClientUtil {

    publicstatic String get(String url)throws Exception {
        CloseableHttpClienthttpClient= HttpClients.createDefault();
        RequestConfigconfig= RequestConfig.custom()
                .setConnectTimeout(12000)
                .setConnectionRequestTimeout(12000)
                .setSocketTimeout(12000)
                .build();

        HttpGetrequest=newHttpGet(url);
        request.setConfig(config);

        try (CloseableHttpResponseresponse= httpClient.execute(request)) {
            // 处理响应
            return"Response received";
        } catch (Exception e) {
            thrownewRuntimeException("HTTP调用失败", e);
        }
    }
}

2. OkHttp

OkHttp是一个现代化的HTTP客户端,它提供了简洁且高效的API。

相比HttpClient,OkHttp更加轻量级且易于使用。

OkHttp支持同步和异步请求,并提供了连接池、GZIP压缩和缓存等高级功能。

java 复制代码
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

publicclassOkHttpUtil {

    privatestaticfinalOkHttpClientCLIENT=newOkHttpClient();

    publicstatic String get(String url)throws Exception {
        Requestrequest=newRequest.Builder()
                .url(url)
                .build();

        try (Responseresponse= CLIENT.newCall(request).execute()) {
            // 处理响应
            return response.body().string();
        }
    }
}

3. OkHttpUtil(封装版)

为了简化OkHttp的使用,我们可以对其进行封装,提供一个更加友好的API接口。

OkHttpUtil封装版就是这样一个工具类,它使得HTTP请求变得异常简单。

// 假设已经有了一个封装好的OkHttpUtil类

java 复制代码
public class OkHttpUtilWrapper {

    public static String get(String url, Map<String, Object> queryParams) throws IOException {
        // 假设OkHttpUtil提供了这样的get方法
        return OkHttpUtil.get(url, queryParams);
    }
}

4. Jodd HTTP

Jodd HTTP是另一个轻量级的HTTP客户端库,它提供了简洁的API和高效的性能。

Jodd HTTP支持各种HTTP方法、请求头、查询参数和表单数据等,非常适合快速构建HTTP请求。

java 复制代码
import jodd.http.HttpRequest;
import jodd.http.HttpResponse;

publicclassJoddHttpUtil {

    publicstatic String get(String url, Map<String, Object> queryParams)throws IOException {
        HttpRequestrequest= HttpRequest.get(url).query(queryParams);
        HttpResponseresponse= request.send();
        return response.bodyText();
    }
}

5. Hutool HTTP

Hutool是一个Java工具类库,其中包含了丰富的HTTP工具类。

Hutool HTTP提供了简洁且强大的HTTP请求功能,支持GET、POST、PUT、DELETE等多种HTTP方法,并内置了连接池和重试机制。

java 复制代码
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;

publicclassHutoolHttpUtil {

    publicstatic String get(String url, Map<String, Object> queryParams)throws IOException {
        HttpRequestrequest= HttpUtil.createGet(url).form(queryParams);
        HttpResponseresponse= request.execute();
        return response.body();
    }
}

6. RestTemplate

RestTemplate是Spring框架提供的一个同步HTTP客户端工具,它简化了与HTTP服务的通信,并统一了异常处理。

RestTemplate支持RESTful风格的URL模板和请求参数的绑定,非常适合与RESTful服务进行交互。

java 复制代码
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;

@Component
publicclassRestTemplateUtil {

    privatefinal RestTemplate restTemplate;

    publicRestTemplateUtil(RestTemplateBuilder builder) {
        this.restTemplate = builder.build();
    }

    public String get(String url, Map<String, Object> queryParams) {
        Stringuri= buildUri(url, queryParams);
        ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
        return response.getBody();
    }

    private String buildUri(String url, Map<String, Object> queryParams) {
        // 构建URI的逻辑
        return url;
    }
}

7. Forest

Forest是一个声明式的HTTP客户端框架,它允许开发者以接口的方式来定义HTTP请求。

Forest提供了简洁的API和强大的功能,如请求重试、超时设置、请求头等,非常适合构建复杂的HTTP请求场景。

yaml 复制代码
# application.yml
forest:
  max-connections: 1000
  connect-timeout: 3000
  read-timeout: 3000
java 复制代码
import com.dtflys.forest.annotation.Get;
import com.dtflys.forest.annotation.Post;
import com.dtflys.forest.annotation.Query;
import com.dtflys.forest.annotation.Header;
import com.dtflys.forest.annotation.JSONBody;
import com.dtflys.forest.springboot.annotation.ForestScan;
import org.springframework.stereotype.Component;

@ForestScan(basePackages = "com.example.client")
@Component
public interface TestClient {

    @Get("http://localhost:20001/test/queryById")
    String queryById(@Header Map<String, Object> headerMap, @Query Map<String, Object> params);

    @Post("http://localhost:20001/test/add")
    String add(@Header Map<String, Object> headerMap, @JSONBody UserVo userVo);
}
相关推荐
devpotato2 小时前
Spring Boot mTLS 报 `keystore password was incorrect`:不一定是密码错了
spring boot·tls·pkcs12·mtls
古城小栈3 小时前
从 cargo-whero 库中,找到提升 rust 的契机
开发语言·后端·rust
keep one's resolveY4 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
阿丰资源6 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
IT_陈寒6 小时前
SpringBoot自动配置的坑差点让我加班到天亮
前端·人工智能·后端
消失的旧时光-19437 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
追风筝的人er7 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
StockTV8 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
金銀銅鐵8 小时前
[git] 如何丢弃对一个文件的改动?
git·后端