HttpLoggingInterceptor没有使用改进2进行日志记录

时间:2016-05-08 21:59:11

标签: android kotlin retrofit2

我试图使用refrofit2,kotlin和logging-interceptor记录所有请求(使用网络拦截器):

  • 改造:" 2.0.2"
  • okhttp3:" 3.2.0"
  • com.squareup.okhttp3:logging-interceptor 3.2.0

像:

val interceptor = HttpLoggingInterceptor()
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    val okHttpClient = OkHttpClient.Builder()
        .addNetworkInterceptor(interceptor) // same for .addInterceptor(...)
        .connectTimeout(30, TimeUnit.SECONDS) //Backend is really slow
        .writeTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .build()

    sRestAdapter = Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl(if (host.endsWith("/")) host else "$host/")
        .addConverterFactory(GsonConverterFactory.create(gson()))
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build()

只是打印:

D/OkHttp: --> GET url...
D/OkHttp: --> END GET

发生了什么事?

---------------编辑--------

记录器未显示在主线程上执行请求的错误,因此请小心。

2 个答案:

答案 0 :(得分:9)

而不是

val okHttpClient = OkHttpClient.Builder()
    .addNetworkInterceptor(interceptor)
    ...

你应该有类似的东西:

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(interceptor)
    ...

因为addNetworkInterceptor()使用拦截器来观察单个网络请求和响应,而addInterceptor()添加拦截器来观察每个呼叫的完整范围:从建立连接(如果有)直到之后选择响应源(原始服务器,缓存或两者)。

修改

  

记录器未显示在主线程上执行请求的错误,因此请小心

在主线程上进行网络连接不是普通的"错误。这将导致您的应用被系统NetworkOnMainThreadException杀死,这将在拦截器被给予任何机会运行之前发生。

答案 1 :(得分:1)

private val interceptor = run {
    val httpLoggingInterceptor = HttpLoggingInterceptor()
    httpLoggingInterceptor.apply {
        httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    }
}


private val okHttpClient = OkHttpClient.Builder()
    .addNetworkInterceptor(interceptor) // same for .addInterceptor(...)
    .connectTimeout(30, TimeUnit.SECONDS) //Backend is really slow
    .writeTimeout(30, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build()