OKHttp 是一个用于 Android 和 Java 应用程序的高效 HTTP 客户端。它提供了一种简洁的 API 来进行 HTTP 请求和响应,并具有良好的性能和强大的功能。OKHttp 由 Square 公司开发,它被广泛应用于 Android 开发中。
OKHttp 的主要特性
- 高效的连接池:重用连接以减少延迟。
- GZIP 压缩:自动处理请求和响应的 GZIP 压缩。
- 缓存机制:支持 HTTP 缓存以减少不必要的请求。
- 透明的内容协商:自动处理服务器返回的多种响应内容类型。
- 异步请求:支持同步和异步的网络请求。
OKHttp 的基本用法
以下是 OKHttp 的基本用法示例,包括同步和异步请求:
引入依赖
在使用 OKHttp 之前,需要在项目中引入相关的依赖。对于 Gradle 项目,可以在 build.gradle 文件中添加以下依赖:
dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.2.0'
}
同步 GET 请求
同步请求是在调用线程中执行的,这意味着在请求完成之前,线程会一直被阻塞。
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class SyncGetExample {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.example.com")
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
}
}
异步 GET 请求
异步请求不会阻塞调用线程,而是通过回调处理响应。
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
import java.io.IOException;
public class AsyncGetExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.example.com")
.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()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
});
}
}
POST 请求
POST 请求通常用于发送数据到服务器。以下是一个同步 POST 请求的示例:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.MediaType;
import okhttp3.Response;
import okhttp3.MultipartBody;
public class SyncPostExample {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
String json = "{"name":"value"}";
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url("https://www.example.com")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
}
}
文件上传
以下是一个上传文件的示例:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.MediaType;
import okhttp3.Response;
import okhttp3.MultipartBody;
import java.io.File;
public class FileUploadExample {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType MEDIA_TYPE_PNG = MediaType.get("image/png");
File file = new File("path/to/your/file.png");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(),
RequestBody.create(file, MEDIA_TYPE_PNG))
.build();
Request request = new Request.Builder()
.url("https://www.example.com/upload")
.post(requestBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
}
}
OKHttp 提供了丰富的 API 和功能,可以满足大多数 HTTP 请求的需求。上面的例子只是基本用法,可以根据实际需求进行扩展和自定义。