OkHttp 是一个强大、高效、支持 HTTP 和 HTTPS 请求的客户端库,广泛用于 Android 和 Java 项目中。它可以轻松地处理网络请求,支持同步/异步请求、连接池、缓存、重定向、拦截器等高级功能。
本文将通过一个 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' |
|---|
首先,我们需要创建一个 OkHttpClient 实例,所有的请求都通过该实例来执行。
import okhttp3.OkHttpClient; |
|---|
OkHttpClient client = new OkHttpClient(); |
|---|
下面是一个发送 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 数据)。发送 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 请求的请求体。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() 分别用于处理响应和异常。OkHttp 允许你通过拦截器来操作请求和响应。拦截器可以用于添加通用的请求头、日志记录、修改响应数据等。
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 添加到请求中。你可以使用 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 记录请求和响应的详细信息。BODY、HEADERS、BASIC 等。OkHttp 还支持 缓存机制,可以使用缓存来减少请求次数,提高性能。
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() 会自动处理缓存,避免重复请求。**
OkHttp3 是一个非常强大且灵活的网络库,能够满足各种类型的网络请求需求。其常用的功能包括:
通过上述功能,你可以轻松地在 Android 或 Java 项目中实现高效、可定制的网络通信。
https://www.52runoob.com/archives/6795
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。