😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
请求超时配置
在 OkhttpClient 中有默认的一些配置,比如连接池、超时时间、写入时间、读取时间等。我们可以通过查看OkhttpClient源码
得知。
默认配置如下:
- 连接超时时间:默认为10秒
- 写入超时时间:默认为10秒
- 读取超时时间:默认为10秒
- Follow Redirects(重定向):默认为 true,即会自动遵循重定向
- 连接池大小:默认为5个
- 重试次数:默认为0,即 不会自动重试请求。
但是默认配置不能满足日常需要,如何进行自定义呢,可使用OkHttpClient.Builder()
来定制化配置。具体如下:
ConnectionPool connectionPool = new ConnectionPool(5,5, TimeUnit.MINUTES);
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS) //连接超时时间
.writeTimeout(30,TimeUnit.SECONDS) //设置写入超时时间
.readTimeout(30,TimeUnit.SECONDS)
.followRedirects(false) //禁用重定向
.connectionPool(connectionPool)
.build();
使用 OkHttpClient.Builder()
构建 OkHttpClient 对象
,并且可以通过调用 builder
的方法来配置 OkHttpClient。
上述我们还定制化了连接池,
// 创建一个连接池,最大空闲连接数为5,每个连接最大保持时间为5分钟
ConnectionPool connectionPool = new ConnectionPool(5,5, TimeUnit.MINUTES);
maxIdleConnections
:最大空闲连接数。keepAliveDuration
:连接保持时间。
OkHttp 会自动管理连接池中的连接,根据需要重用已经存在的连接或创建新的连接。连接池会根据连接的空闲时间来关闭不再需要的连接,以节省资源。
重连机制
在 Okhttp 中不直接提供内置的重连机制,可以通过自定义Interceptor 来实现请求失败时的重试逻辑,这块涉及到拦截器的应用,具体使用如下:
package com.qiniu.interceptortest;
import androidx.annotation.NonNull;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.*;
public class ReConnectionTest {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new RetryInterceptor(3))
.build();
//创建请求
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
// 使用 OkHttpClient 实例来发送请求,并处理响应。
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
System.out.println("Request failed: " + e.getMessage());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// 处理响应数据
if (response.isSuccessful()) {
String responseData = response.body().string();
System.out.println(responseData);
// 处理响应数据
} else {
// 处理失败响应
}
}
});
}
static class RetryInterceptor implements Interceptor{
private int maxRetries;
private int retryCount = 0;
public RetryInterceptor(int maxRetries) {
this.maxRetries = maxRetries;
}
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
while (!response.isSuccessful() && retryCount < maxRetries){
retryCount++;
response = chain.proceed(request);
}
return response;
}
}
}
通过拦截器来实现重连机制
,拦截器用于在发送请求和接收响应的过程中拦截、修改和处理请求和响应数据。拦截器允许开发人员在网络请求的不同阶段介入,并对请求和响应进行各种操作,如修改请求头、记录日志、重试请求、添加认证信息等。
人生像一部电影,有些人就像弹出来的广告