OkHttp3 基本使用教程

OkHttp 是一个强大、高效、支持 HTTP 和 HTTPS 请求的客户端库,广泛用于 Android 和 Java 项目中。它可以轻松地处理网络请求,支持同步/异步请求、连接池、缓存、重定向、拦截器等高级功能。

本文将通过一个 OkHttp3 的详细使用教程,介绍其基本功能,包括如何发起请求、处理响应、处理异常、使用拦截器等。


1. 引入 OkHttp3 依赖

首先,你需要在项目中引入 OkHttp3 的依赖。如果你在 Android 项目 中使用 OkHttp,请在 build.gradle 文件中添加:

dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}

对于 Java 项目,你可以使用 Maven 或 Gradle 来添加依赖:

Maven(pom.xml):

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.0</version>
</dependency>

Gradle:

implementation 'com.squareup.okhttp3:okhttp:4.9.0'


2. 发起基本请求

2.1 创建 OkHttpClient 实例

首先,我们需要创建一个 OkHttpClient 实例,所有的请求都通过该实例来执行。

import okhttp3.OkHttpClient;

OkHttpClient client = new OkHttpClient();

2.2 发送 GET 请求

下面是一个发送 GET 请求 的基本例子:

import okhttp3.Request;
import okhttp3.Response;

public class Main {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        // 创建请求对象
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .build();

        // 执行请求并获取响应
        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                // 打印响应体
                System.out.println(response.body().string());
            } else {
                System.out.println("请求失败: " + response.message());
            }
        }
    }
}

解释

  • Request.Builder().url() 用来构建请求。
  • client.newCall(request).execute() 发送请求并获取响应。
  • response.body().string() 获取响应体内容(通常是 JSON 数据)。

2.3 发送 POST 请求

发送 POST 请求 时,需要在请求体中发送数据。可以使用 RequestBody 来封装数据。

import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.MediaType;

public class Main {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        // 请求体
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        String json = "{\"name\":\"John\", \"age\":30}";
        RequestBody body = RequestBody.create(json, JSON);

        // 创建 POST 请求
        Request request = new Request.Builder()
                .url("https://httpbin.org/post")
                .post(body)
                .build();

        // 执行请求并获取响应
        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.body().string());
        }
    }
}

解释

  • RequestBody.create() 用来创建请求体,指定数据类型和内容。
  • .post(body) 用来设置 POST 请求的请求体。

2.4 发送异步请求

OkHttp 也支持 异步请求,可以在后台线程中执行请求,而不会阻塞主线程。

import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        // 创建请求对象
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .build();

        // 执行异步请求
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                System.out.println("请求失败: " + e.getMessage());
            }

            @Override
            public void onResponse(Response response) throws IOException {
                if (response.isSuccessful()) {
                    System.out.println(response.body().string());
                } else {
                    System.out.println("请求失败: " + response.message());
                }
            }
        });
    }
}

解释

  • enqueue() 方法使请求异步执行。
  • onResponse() 和 onFailure() 分别用于处理响应和异常。

3. 使用请求拦截器

OkHttp 允许你通过拦截器来操作请求和响应。拦截器可以用于添加通用的请求头、日志记录、修改响应数据等。

3.1 添加拦截器

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws Exception {
        // 创建拦截器
        Interceptor loggingInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                System.out.println("请求头: " + request.headers());
                // 在请求头中添加自定义信息
                Request newRequest = request.newBuilder()
                        .addHeader("Authorization", "Bearer token")
                        .build();
                return chain.proceed(newRequest);
            }
        };

        // 创建 OkHttpClient,添加拦截器
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .build();

        // 创建请求对象
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .build();

        // 执行请求
        try (Response response = client.newCall(request).execute()) {
            System.out.println("响应内容: " + response.body().string());
        }
    }
}

解释

  • 创建了一个日志拦截器,将请求头中的 Authorization 添加到请求中。
  • 拦截器可以修改请求和响应内容。

3.2 日志拦截器(Logging Interceptor)

你可以使用 OkHttp 的 Logging Interceptor 来打印 HTTP 请求和响应的详细日志信息,这对调试非常有用。

首先,添加依赖:

implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'

使用日志拦截器:

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;

public class Main {
    public static void main(String[] args) {
        // 创建日志拦截器
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 日志级别

        // 创建 OkHttpClient,添加日志拦截器
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .build();

        // 创建请求对象
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .build();

        // 执行请求
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                System.out.println("请求失败: " + e.getMessage());
            }

            @Override
            public void onResponse(Response response) throws IOException {
                System.out.println(response.body().string());
            }
        });
    }
}

解释

  • HttpLoggingInterceptor 记录请求和响应的详细信息。
  • 可以设置不同的日志级别,如 BODYHEADERSBASIC 等。

4. 配置缓存

OkHttp 还支持 缓存机制,可以使用缓存来减少请求次数,提高性能。

4.1 创建缓存对象

import okhttp3.Cache;
import okhttp3.OkHttpClient;
import java.io.File;

public class Main {
    public static void main(String[] args) {
        // 设置缓存文件夹和大小
        File cacheDirectory = new File("cache");
        Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024); // 10MB

        // 创建 OkHttpClient,启用缓存
        OkHttpClient client = new OkHttpClient.Builder()
                .cache(cache)
                .build();

        // 创建请求对象
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .build();

        // 执行请求
        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.body().string());
        }
    }
}

解释

  • Cache 对象定义了缓存的存储位置和大小。
  • client.newCall(request).execute() 会自动处理缓存,避免重复请求。

**5. 总结

**

OkHttp3 是一个非常强大且灵活的网络库,能够满足各种类型的网络请求需求。其常用的功能包括:

  • 同步请求 和 异步请求
  • 使用 拦截器 来处理请求、响应和日志。
  • 缓存 的实现,以提高性能。
  • 请求超时 和 重试机制

通过上述功能,你可以轻松地在 Android 或 Java 项目中实现高效、可定制的网络通信。