代码之家  ›  专栏  ›  技术社区  ›  Hector

在Android项目中使用改造时如何动态配置OkHttpClient

  •  1
  • Hector  · 技术社区  · 6 年前

    我在我的Android应用程序中进行了网络改造

    api "com.squareup.retrofit2:retrofit:$retrofit2Version"
    api "com.squareup.retrofit2:adapter-rxjava2:$retrofit2Version"
    api "com.squareup.retrofit2:converter-scalars:$retrofit2Version"
    api "com.squareup.retrofit2:converter-jackson:$retrofit2Version"
    

    在开发我的项目时,使用

    api "com.squareup.okhttp3:logging-interceptor:$okhttp3Version"
    

    我将改装配置如下:-

    abstract class BaseService {
    
        internal val okHttpClient = OkHttpClient.Builder()
                .connectTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
                .callTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
                .followSslRedirects(true)
                .retryOnConnectionFailure(true)
                .followRedirects(true)
                .addInterceptor(HTTP_HEADERS)
                .addInterceptor(HTTP_LOGGING_INTERCEPTOR)
                .build()
    
        companion object {
    
            private const val OK_HTTP_CLIENT_TIMEOUT: Long = 60
    
            private val HTTP_LOGGING_INTERCEPTOR = HttpLoggingInterceptor()
            private val HTTP_HEADERS = constructHeaderInterceptor()
    
            private const val HTTP_ORIGIN_HEADER = "Origin"
            private const val HTTP_ORIGIN_VALUE = "Android"
    
            private fun constructHeaderInterceptor(): Interceptor {
                return Interceptor {
                    val request = it.request()
                    val newRequest = request.newBuilder().addHeader(HTTP_ORIGIN_HEADER, HTTP_ORIGIN_VALUE).build()
                    it.proceed(newRequest)
                }
            }
    
            init {
                HTTP_LOGGING_INTERCEPTOR.level = HttpLoggingInterceptor.Level.NONE
            }
        }
    }
    

    然后在我的服务实施中:-

    class Service private constructor() : BaseService(), Api {
    
        private val service: Api
    
        init {
            val retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(JacksonConverterFactory.create())
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .build()
    
            service = retrofit.create(Api::class.java)
       }
    
    
        override fun query(authenticationToken: String, request: Request): Single<Response<QueryResponse>> {
            return service.query(authenticationToken, request)
        }
    
        companion object {
    
            private val BASE_URL = BuildConfig.SDK_BASE_URL
    
            private val INSTANCE = Service()
    
            fun instance(): Api {
                return INSTANCE
            }
        }
    }
    

    我面临的问题是

    HttpLoggingInterceptor.Level.BODY
    

    logcat的输出“过多”,因为我的一些网络调用响应是非常大的Json文档。

    我想要的是,我可以在细粒度级别配置我的网络呼叫日志记录,例如逐个呼叫。

    但我能看到如何实现这一点的唯一方法是创建一个成对的 OkHttpClient & retrofit 对于每个日志记录级别,例如。 BODY , HEADERS , BASIC NONE .

    最好是能够逐个调用设置日志记录值,并且只使用单个 OkHttpClient & 改造 例子

    有没有办法在一个呼叫级别上设置不同的日志记录级别?

    0 回复  |  直到 6 年前
        1
  •  2
  •   veritas1    6 年前

    您可以创建自己的记录器,并将其委托给HttpLoggingInterceptor。

    class MyLoggingInterceptor(private val logger: HttpLoggingInterceptor) : Interceptor {
    
        override fun intercept(chain: Interceptor.Chain): Response {
            if (chain.request().url().toString().contains("condition")) {
                logger.level = HttpLoggingInterceptor.Level.BODY
            } else {
                logger.level = HttpLoggingInterceptor.Level.HEADERS
            }
            return logger.intercept(chain)
        }
    }
    

    然后添加到OkHttp生成器

    .addInterceptor(MyLoggingInterceptor(HttpLoggingInterceptor()))