我有一个okhttp3(3.9.1)WebSocket
实例,想查看它的所有网络请求和响应。我尝试在okhttp3.Interceptor
实例上添加一些OkHttpClient
实例,然后在其上创建WebSocket
,但在查看网络活动时没有运气。这是示例代码,演示了我尝试过的内容:
package sample
import okhttp3.*
import java.io.IOException
import java.lang.Thread.sleep
fun main(args: Array<String>) {
val listener = object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket?, text: String?) {
println("Got server message: $text")
}
}
val dummyInterceptor = Interceptor { chain ->
val request = chain.request()
val response = chain.proceed(request)
println("Dummy interceptor fired!\n\nRequest: ${request.headers()}\nResponse: ${response.headers()}")
return@Interceptor response
}
val dummyNetworkInterceptor = Interceptor { chain ->
val request = chain.request()
val response = chain.proceed(request)
println("Dummy network interceptor fired!\n\nRequest: ${request.headers()}\nResponse: ${response.headers()}")
return@Interceptor response
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(dummyInterceptor)
.addNetworkInterceptor(dummyNetworkInterceptor)
.build()
val request = Request.Builder().url("ws://echo.websocket.org").build()
val webSocket = okHttpClient.newWebSocket(request, listener)
webSocket.send("Hello1!")
webSocket.send("Hello2!")
webSocket.send("Hello3!")
sleep(2000) //Just for this sample to ensure all WS requests done
println("\n\n\tSome network activity\n\n")
okHttpClient.newCall(Request.Builder().get().url("http://echo.websocket.org").build()).enqueue(object : Callback {
override fun onFailure(call: Call?, exc: IOException?) {
println("OnFailure: ${exc?.message}")
}
override fun onResponse(call: Call?, response: Response?) {
println("OnResponse: ${response?.headers()}")
}
})
}
我试图深入研究okhttp3源代码,并没有找到任何理由为什么我的任何拦截器都不会触发WS请求,但是对于任何OkHttpClient
请求都能正常工作。
这是okhttp3中的错误还是我做错了什么或者是不可能使用okhttp3.Interceptor
来监控WS请求?
答案 0 :(得分:2)
使用OkHttp进行的WebSocket调用不使用HTTP调用的拦截链,因此您无法通过拦截器监视它们。
我之前已经遇到过这个问题,所以我查看了源代码并找到了以下内容:
RealCall
类中的pandas documentation方法,很明显地为每个请求启动了拦截器的链接调用。okhttp3.internal.ws
包中不包含与拦截器相关的代码。实际上,拦截器捕获WebSocket请求并不是真的有意义。您可以在拦截器中获取的Request
表示HTTP请求,getResponseWithInterceptorChain()
。
答案 1 :(得分:0)
目前尚不可能,有一个针对OkHttp的功能请求,但是并没有太大的吸引力:https://github.com/square/okhttp/issues/4192