使用 OkHttp 封装 API 调用实践
在 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 协议》,转载必须注明作者和本文链接
关于 LearnKu