我有一个okhttp3 (3.9.1) WebSocket实例,并且希望查看它的所有网络请求和响应。我试图在OkHttpClient实例上创建WebSocket之前添加一些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请求是不可能的
发布于 2018-02-18 20:56:41
使用WebSocket进行的OkHttp调用不使用HTTP调用所执行的拦截器链,因此无法通过拦截器监视它们。
在我之前,我就面临过这个问题,所以我查看了源代码,然后发现了以下内容:
getResponseWithInterceptorChain()类中的RealCall方法,它非常清楚地为每个请求启动拦截器的链式调用。实际上,拦截器捕获WebSocket请求从一开始就没有意义。您可以在拦截器中获得的Request表示一个WebSocket messages are not请求。
发布于 2019-07-29 04:05:51
这是不可能的,在这一点上,有一个特性请求为OkHttp打开,但它没有得到太多的牵引力:https://github.com/square/okhttp/issues/4192
https://stackoverflow.com/questions/48856206
复制相似问题