Как динамически настроить OkHttpClient при использовании Retrofit? - PullRequest
1 голос
/ 26 июня 2019

Я использую Retrofit в своем приложении для 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"

При разработке моих проектов очень полезно регистрировать HTTP-запросы и ответы, используя

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

. Я настраиваю Retrofit следующим образом: -

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 & retrofit.

Есть лиВ любом случае, я могу установить разные уровни ведения журнала при вызове по уровню вызова.л

1 Ответ

2 голосов
/ 26 июня 2019

Вы можете создать свой собственный регистратор и делегировать 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()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...