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

相关推荐
maycho1232 天前
裂隙瓦斯模型的Comsol模拟之旅
okhttp
chilavert3189 天前
技术演进中的开发沉思-235 Ajax:动态数据(上)
javascript·ajax·okhttp
灰什么鱼10 天前
OkHttp + Retrofit2 调用第三方接口完整教程(以nomad为例)
java·spring boot·okhttp·retrofit
苏打水com11 天前
第六篇:Day16-18 AJAX进阶+接口对接——实现“前后端数据交互”(对标职场“接口开发”核心需求)
css·okhttp·html·js
漏洞文库-Web安全11 天前
CTFHub XSS通关:XSS-过滤关键词 - 教程
前端·安全·web安全·okhttp·网络安全·ctf·xss
chilavert31812 天前
技术演进中的开发沉思-229 Ajax:Firefox 与 Firebug
javascript·okhttp
chilavert31813 天前
技术演进中的开发沉思-224 Ajax面向对象与框架
javascript·okhttp
chilavert31813 天前
技术演进中的开发沉思-227 Ajax: Ajax 缺陷
javascript·okhttp
by__csdn14 天前
Ajax与Axios终极对比指南全方位对比解析
前端·javascript·ajax·okhttp·typescript·vue·restful