使用 OkHttp 封装 API 调用实践

AI摘要
本文分享了在Java后端项目中,使用OkHttp进行HTTP客户端统一封装以提升代码可维护性的实践经验。作者从基础客户端封装、拦截器统一处理日志以及结合高频接口场景三个方面,阐述了集中管理超时、异常和日志的策略,强调了结构化设计对降低系统维护成本的重要性。这是一篇技术性的知识分享。

在 Java 后端项目中,接口调用通常依赖 HttpClient、OkHttp 或 Spring 自带的 RestTemplate。随着接口数量增加,如果不做统一封装,代码中会充斥重复的请求构造、异常判断和日志打印逻辑,维护成本会越来越高。
我个人更倾向使用 OkHttp 做基础封装,因为它结构清晰,扩展性也不错。
一、基础客户端封装

public class ApiClient {

    private final OkHttpClient client;
    private final String baseUrl;

    public ApiClient(String baseUrl) {
        this.baseUrl = baseUrl;
        this.client = new OkHttpClient.Builder()
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();
    }

    public String get(String path) throws IOException {
        Request request = new Request.Builder()
                .url(baseUrl + path)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            return response.body().string();
        }
    }
}

这种方式可以统一管理超时和连接池。
二、拦截器统一处理日志
OkHttp 支持拦截器,可以统一记录请求耗时:

.addInterceptor(chain -> {
    long start = System.currentTimeMillis();
    Response response = chain.proceed(chain.request());
    long cost = System.currentTimeMillis() - start;
    System.out.println("cost=" + cost);
    return response;
})

这样可以避免在业务层重复写日志代码。
三、结合真实接口场景
在对接某些实时行情服务时,例如以 AllTick 这类数据接口为例,请求频率较高,且对响应时间要求严格。如果每个接口都单独构造客户端实例,会浪费资源,也容易遗漏超时设置。
通过集中封装:
所有接口统一超时策略
所有异常统一处理
日志统一输出
当接口规模扩大后,这种结构化设计会明显降低维护成本。
接口调用不是简单的“发请求”,而是系统稳定性的一个关键组成部分。越早做好封装,后续改动越轻松。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!