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

相关推荐
alexhilton1 小时前
藏在设备上的秘密,终究藏不住
android·kotlin·android jetpack
步行cgn2 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风2 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae2 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路3 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog4 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog4 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz4 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
qq_2518364575 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
caoerzhong5 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源