Я использую 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
.
Есть лиВ любом случае, я могу установить разные уровни ведения журнала при вызове по уровню вызова.л