在Java中使用OkHttp实现接口调用,需先引入依赖,再通过OkHttpClient、Request、Response三大核心类完成请求。以下是3种典型场景的实现方案:
一、前置准备:引入OkHttp依赖
在pom.xml(Maven)或build.gradle(Gradle)中添加依赖:
com.squareup.okhttp3 okhttp 4.12.0
// Gradle
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
方案1:GET请求(无参数/URL参数)
适用于获取资源的场景,参数直接拼在URL中或通过HttpUrl构建:
import okhttp3.*;
import java.io.IOException;
public class OkHttpGetExample {
private static final OkHttpClient client = new OkHttpClient(); // 全局单例,避免重复创建
public static void main(String[] args) {
// 1. 方式1:直接拼接URL参数
String url1 = "https://api.example.com/users?id=123&name=test";
// 2. 方式2:用HttpUrl.Builder构建(更安全,自动编码特殊字符)
HttpUrl url2 = new HttpUrl.Builder()
.scheme("https")
.host("api.example.com")
.addPathSegment("users")
.addQueryParameter("id", "123")
.addQueryParameter("name", "test")
.build();
Request request = new Request.Builder()
.url(url2) // 或url1
.get() // 默认就是GET,可省略
.addHeader("Authorization", "Bearer your_token") // 可选:添加请求头
.build();
// 同步调用(阻塞线程,适合简单场景)
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseBody = response.body().string(); // 读取响应体(仅能调用一次)
System.out.println("GET响应结果:" + responseBody);
} else {
System.out.println("请求失败,状态码:" + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
方案2:POST请求(表单/JSON参数)
适用于提交数据的场景,支持表单(FormBody)和JSON(RequestBody)两种参数格式:
2.1 POST表单参数
public class OkHttpPostFormExample {
public static void main(String[] args) {
// 构建表单参数
RequestBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
Request request = new Request.Builder()
.url("https://api.example.com/login")
.post(formBody)
.build();
// 异步调用(非阻塞,适合高并发场景)
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
System.out.println("POST表单响应:" + response.body().string());
}
}
});
}
}
2.2 POST JSON参数
public class OkHttpPostJsonExample {
public static void main(String[] args) {
// 构建JSON参数(需手动拼接或用JSON库序列化)
String json = "{"username":"admin","password":"123456"}";
RequestBody jsonBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8") // 指定Content-Type为JSON
);
Request request = new Request.Builder()
.url("https://api.example.com/login")
.post(jsonBody)
.build();
// 异步调用
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println("POST JSON响应:" + response.body().string());
}
});
}
}
方案3:文件上传(MultipartBody)
适用于上传文件(如图片、文档)的场景,通过MultipartBody构建多部分请求:
import okhttp3.MultipartBody;
import java.io.File;
public class OkHttpFileUploadExample {
public static void main(String[] args) {
// 构建文件上传请求体
File file = new File("D:/test.jpg"); // 本地文件路径
RequestBody fileBody = RequestBody.create(
file,
MediaType.parse("image/jpeg") // 根据文件类型指定MediaType
);
RequestBody multipartBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM) // 必须指定为FORM类型
.addFormDataPart("file", file.getName(), fileBody) // 上传的文件
.addFormDataPart("description", "测试图片") // 附加的文本参数
.build();
Request request = new Request.Builder()
.url("https://api.example.com/upload")
.post(multipartBody)
.build();
// 同步调用
try (Response response = client.newCall(request).execute()) {
System.out.println("文件上传结果:" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键注意事项
OkHttpClient单例:OkHttpClient是线程安全的,建议全局只创建一个实例,避免重复创建连接池;
响应体读取:response.body().string()只能调用一次(流关闭后无法再次读取),若需多次使用,需先保存为字符串;
异步调用:enqueue是异步非阻塞的,回调方法运行在OkHttp的工作线程中,若需更新UI(如Android),需切换到主线程;
异常处理:网络请求可能抛出IOException,需捕获并处理(如超时、连接失败);
超时配置:可通过OkHttpClient.Builder设置超时(默认10秒):OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS) // 连接超时
.readTimeout(30, TimeUnit.SECONDS) // 读取超时
.writeTimeout(30, TimeUnit.SECONDS) // 写入超时
.build();
根据场景选择同步/异步调用,表单/JSON参数格式,OkHttp的API设计简洁且灵活,是Spring Boot中替代RestTemplate的常用选择。