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请求场景。通过合理配置拦截器、超时和缓存,可以进一步优化网络请求性能。

相关推荐
青春逝如流水10 分钟前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
wangbing11252 小时前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443565 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w8 小时前
什么是AOP
java
Cc.Y8 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck8 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787059 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev9 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha9 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞9 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计