package com.android.app_base.http; import android.content.Context; import androidx.annotation.NonNull; import com.android.app_base.BuildConfig; import com.android.app_base.base.BaseApplication; import com.android.app_base.http.interceptor.AuthInterceptor; import com.android.app_base.http.interceptor.CacheInterceptor; import com.android.app_base.http.interceptor.LogInterceptor; import com.blankj.utilcode.util.LogUtils; import com.franmontiel.persistentcookiejar.PersistentCookieJar; import com.franmontiel.persistentcookiejar.cache.SetCookieCache; import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; /** * @author Ljj * @date 2023.03.01. 22:36 * @desc 网络请求OkHttp配置 */ public class OkHttpHelper { //超时时间 private final static int READ_TIMEOUT = 15; private final static int CONNECT_TIMEOUT = 15; private final static int WRITE_TIMEOUT = 15; //缓存时间 private final static int CACHE_SIZE = 10 * 1024 * 1024; private static volatile OkHttpClient okHttpClient; private OkHttpHelper() { OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); //读取超时 clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS); //连接超时 clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); //写入超时 clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); //错误重连 clientBuilder.retryOnConnectionFailure(true); //cookie Context mContext = BaseApplication.getInstance(); clientBuilder.cookieJar(new PersistentCookieJar(new SetCookieCache(),new SharedPrefsCookiePersistor(mContext))); //缓存拦截 Cache cache = new Cache(new File(mContext.getCacheDir(),"http_cache"),CACHE_SIZE); clientBuilder.cache(cache).addInterceptor(new CacheInterceptor()); //增加头部信息拦截 clientBuilder.addInterceptor(new Interceptor() { @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { Request build = chain.request().newBuilder() .addHeader("Content-Type", "application/json") .build(); return chain.proceed(build); } }); clientBuilder.addInterceptor(new LogInterceptor());//拦截器添加公共参数 clientBuilder.addInterceptor(new AuthInterceptor());//拦截器token失效处理 //log日志拦截 if (BuildConfig.DEBUG) { clientBuilder.addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { try { String msg = message.replaceAll("%(?![0-9a-fA-F]{2})","%25"); String text = URLDecoder.decode(msg, "utf-8"); LogUtils.dTag("LOG","网络请求"+text); } catch (UnsupportedEncodingException e) { e.printStackTrace(); LogUtils.dTag("LOG","网络请求错误信息"+e.getMessage()); } } }).setLevel(HttpLoggingInterceptor.Level.BODY)); } okHttpClient = clientBuilder.build(); } public static OkHttpClient getOkHttpClient() { if (null == okHttpClient) { synchronized (OkHttpHelper.class) { if (okHttpClient == null) { new OkHttpHelper(); return okHttpClient; } } } return okHttpClient; } public static void addInterceptor(Interceptor interceptor){ okHttpClient = getOkHttpClient().newBuilder().addInterceptor(interceptor).build(); } }