我试图使用refrofit2,kotlin和logging-interceptor记录所有请求(使用网络拦截器):
像:
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
发生了什么事?
---------------编辑--------
记录器未显示在主线程上执行请求的错误,因此请小心。
答案 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()