如何使用 okhttp3.Interceptor 捕获 okhttp3 WebSocket 网络 activity?
How to catch okhttp3 WebSocket network activity using okhttp3.Interceptor?
我有一个 okhttp3 (3.9.1) WebSocket
实例,想查看它的所有网络请求和响应。在创建 WebSocket
之前,我尝试将一些 okhttp3.Interceptor
实例添加到 OkHttpClient
实例,但没有成功查看网络 activity。这是演示我尝试做的事情的示例代码:
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 请求?
使用 OkHttp 进行的 WebSocket 调用不使用 HTTP 调用所使用的拦截器链,因此您无法通过拦截器监视它们。
我之前遇到过这个问题,所以我查看了源代码,然后发现以下内容:
- 常规的 HTTP 调用通过
RealCall
class 中的 getResponseWithInterceptorChain()
方法,这很清楚地启动了每个请求的拦截器链式调用。
- 包含 WebSocket 处理实现的
okhttp3.internal.ws
包不包含与拦截器相关的代码。
实际上,捕获 WebSocket 请求的拦截器从一开始就没有真正意义。在拦截器中可以得到的Request
代表一个HTTP请求,.
目前还不可能,有一个针对 OkHttp 的功能请求,但它没有得到太多关注:https://github.com/square/okhttp/issues/4192
我有一个 okhttp3 (3.9.1) WebSocket
实例,想查看它的所有网络请求和响应。在创建 WebSocket
之前,我尝试将一些 okhttp3.Interceptor
实例添加到 OkHttpClient
实例,但没有成功查看网络 activity。这是演示我尝试做的事情的示例代码:
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 请求?
使用 OkHttp 进行的 WebSocket 调用不使用 HTTP 调用所使用的拦截器链,因此您无法通过拦截器监视它们。
我之前遇到过这个问题,所以我查看了源代码,然后发现以下内容:
- 常规的 HTTP 调用通过
RealCall
class 中的getResponseWithInterceptorChain()
方法,这很清楚地启动了每个请求的拦截器链式调用。 - 包含 WebSocket 处理实现的
okhttp3.internal.ws
包不包含与拦截器相关的代码。
实际上,捕获 WebSocket 请求的拦截器从一开始就没有真正意义。在拦截器中可以得到的Request
代表一个HTTP请求,
目前还不可能,有一个针对 OkHttp 的功能请求,但它没有得到太多关注:https://github.com/square/okhttp/issues/4192