OKHTTP 如何处理请求超时和重连机制

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD

如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。

😊 座右铭:不想当开发的测试,不是一个好测试✌️。

如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

请求超时配置

在 OkhttpClient 中有默认的一些配置,比如连接池、超时时间、写入时间、读取时间等。我们可以通过查看OkhttpClient源码得知。

默认配置如下:

  • 连接超时时间:默认为10秒
  • 写入超时时间:默认为10秒
  • 读取超时时间:默认为10秒
  • Follow Redirects(重定向):默认为 true,即会自动遵循重定向
  • 连接池大小:默认为5个
  • 重试次数:默认为0,即 不会自动重试请求。
    但是默认配置不能满足日常需要,如何进行自定义呢,可使用 OkHttpClient.Builder() 来定制化配置。具体如下:
java 复制代码
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。

上述我们还定制化了连接池,

java 复制代码
// 创建一个连接池,最大空闲连接数为5,每个连接最大保持时间为5分钟
ConnectionPool connectionPool = new ConnectionPool(5,5, TimeUnit.MINUTES);
  • maxIdleConnections:最大空闲连接数。
  • keepAliveDuration:连接保持时间。

OkHttp 会自动管理连接池中的连接,根据需要重用已经存在的连接或创建新的连接。连接池会根据连接的空闲时间来关闭不再需要的连接,以节省资源。

重连机制

在 Okhttp 中不直接提供内置的重连机制,可以通过自定义Interceptor 来实现请求失败时的重试逻辑,这块涉及到拦截器的应用,具体使用如下:

java 复制代码
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;
        }
    }
}

通过拦截器来实现重连机制,拦截器用于在发送请求和接收响应的过程中拦截、修改和处理请求和响应数据。拦截器允许开发人员在网络请求的不同阶段介入,并对请求和响应进行各种操作,如修改请求头、记录日志、重试请求、添加认证信息等。

人生像一部电影,有些人就像弹出来的广告

相关推荐
cyt涛15 天前
WebMvcConfigurer自定义配置
mvc·自定义·web·配置·拦截器·configurer·消息转换器
小曾同学.com24 天前
在 Android 应用程序中实现与WebSocket 服务器的实时通信
websocket·okhttp·android开发·handler·okhttpclient·websocket事件监听
jackletter1 个月前
消息队列10:为RabbitMq添加连接池
rabbitmq·连接池
追梦的鱼儿2 个月前
okhttp 拦截器用过那些? 什么情况下用的?如何使用?
okhttp·拦截器
摇曳的精灵2 个月前
MyBatis-Plus 拦截器
java·mybatis·拦截器·乐观锁·分页
小李同学_LHY3 个月前
Spring Boot实战:拦截器
java·前端·spring boot·拦截器
无理 Java3 个月前
【过滤器 vs 拦截器】SpringBoot中过滤器与拦截器:明智选择的艺术(如何在项目中做出明智选择)
java·spring boot·后端·面试·实战·过滤器·拦截器
AKA石头3 个月前
apache.commons.pool2 使用指南
apache·连接池·对象池·池化·commons.pool2
yangshuquan4 个月前
分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
c#·.net·拦截器·ef