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