使用OkHttp实现接口调用

在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的常用选择。

相关推荐
.豆鲨包2 天前
【Android】OkHttp的使用及封装
android·java·okhttp
华科易迅2 天前
Vue通过Ajax获取后台路由信息
vue.js·ajax·okhttp
studyForMokey3 天前
【Android面试】OkHttp & Retrofit 专题
android·okhttp·面试
fLDiSQV1W4 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
网络协议·http·okhttp
Ttang238 天前
Java爬虫:Jsoup+OkHttp实战指南
java·爬虫·okhttp
李庆政3708 天前
OkHttp的基本使用 实现GET/POST请求 authenticator自动认证 Cookie管理 请求头设置
java·网络协议·http·okhttp·ssl
无名-CODING9 天前
Java 爬虫进阶:动态网页、多线程与 WebMagic 框架实战
java·爬虫·okhttp
小李云雾10 天前
零基础-从ESS6基础到前后端联通实战
前端·python·okhttp·中间件·eclipse·html·fastapi
亿牛云爬虫专家10 天前
爬虫踩坑实录:OkHttp 接入爬虫代理报 Too many tunnel connections attempted 深度解析
爬虫·okhttp·https·爬虫代理·connect·隧道代理·ip 切换