OkHttp使用指南

OkHttp使用指南

OkHttp是一个高效的HTTP客户端,支持同步和异步请求,适用于Android和Java应用。以下是一篇关于如何使用OkHttp的文章。


添加依赖

在项目的build.gradle文件中添加OkHttp依赖:

groovy 复制代码
implementation 'com.squareup.okhttp3:okhttp:4.9.3'

确保同步项目以加载依赖。


同步GET请求

发送同步GET请求需要创建一个OkHttpClient实例,构建请求并执行:

java 复制代码
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
    .url("https://api.example.com/data")
    .build();

try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        System.out.println(responseBody);
    }
} catch (IOException e) {
    e.printStackTrace();
}

异步GET请求

异步请求通过enqueue方法实现,回调在子线程中执行:

java 复制代码
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
    .url("https://api.example.com/data")
    .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()) {
            String responseBody = response.body().string();
            System.out.println(responseBody);
        }
    }
});

POST请求发送JSON数据

构建POST请求需要设置请求体和Content-Type头:

java 复制代码
OkHttpClient client = new OkHttpClient();
String json = "{\"name\":\"John\", \"age\":30}";

RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));

Request request = new Request.Builder()
    .url("https://api.example.com/post")
    .post(body)
    .build();

try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        System.out.println(response.body().string());
    }
} catch (IOException e) {
    e.printStackTrace();
}

文件上传

通过MultipartBody实现文件上传功能:

java 复制代码
OkHttpClient client = new OkHttpClient();
File file = new File("path/to/file.jpg");

RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", file.getName(),
        RequestBody.create(file, MediaType.parse("image/jpeg")))
    .addFormDataPart("description", "A sample file")
    .build();

Request request = new Request.Builder()
    .url("https://api.example.com/upload")
    .post(requestBody)
    .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(response.body().string());
    }
});

拦截器使用

拦截器可以用于日志记录或修改请求/响应。以下是一个日志拦截器示例:

java 复制代码
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();

确保在调试时使用Level.BODY,生产环境中建议关闭或使用Level.BASIC


超时设置

通过OkHttpClient.Builder可以配置连接、读取和写入超时:

java 复制代码
OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .writeTimeout(30, TimeUnit.SECONDS)
    .build();

缓存配置

启用缓存可以提高性能并减少网络请求:

java 复制代码
int cacheSize = 10 * 1024 * 1024; // 10MB
Cache cache = new Cache(new File("cacheDir"), cacheSize);

OkHttpClient client = new OkHttpClient.Builder()
    .cache(cache)
    .build();

总结

OkHttp提供了简洁的API和强大的功能,适用于各种HTTP请求场景。通过合理配置拦截器、超时和缓存,可以进一步优化网络请求性能。

相关推荐
古法安卓3 小时前
Android-日志系统源码解析
android·java·android studio
恋猫de小郭4 小时前
Android 17 + OkHttp 5.5.0 ,全新 ECH 下你的 HTTPS 域名可以请求时被安全隐藏
android·前端·flutter
小强闯江湖4 小时前
不只是让 AI 写代码:ViewCompose 把 Android UI 做成了可编译、可渲染的闭环
android·人工智能·kotlin
小夏coding4 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng5 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
hunterandroid5 小时前
StateFlow 与 SharedFlow 的边界:状态与事件的正确建模
android·前端
YF02115 小时前
Android遥控器对频详解
android·android things
十年Java程序媛6 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
码农coding6 小时前
android12 WindowManagerService窗口的布局过程
android·源码
xiaoqiMikko7 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat