自学内容网 自学内容网

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

😄作者简介: 小曾同学.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;
        }
    }
}

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

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


原文地址:https://blog.csdn.net/weixin_42182599/article/details/142766383

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!