如何使用okhttp3.Interceptor捕获OKHTTP3WebSocket网络活动?
我有一个okhttp3(3.9.1)如何使用okhttp3.Interceptor捕获OKHTTP3WebSocket网络活动?,websocket,kotlin,okhttp3,Websocket,Kotlin,Okhttp3,我有一个okhttp3(3.9.1)WebSocket实例,希望查看它的所有网络请求和响应。在创建WebSocket之前,我尝试将一些okhttp3.Interceptor实例添加到OkHttpClient实例中,但没有幸查看网络活动。下面是示例代码,演示了我尝试执行的操作: package sample import okhttp3.* import java.io.IOException import java.lang.Thread.sleep fun main(args: Array
WebSocket
实例,希望查看它的所有网络请求和响应。在创建WebSocket
之前,我尝试将一些okhttp3.Interceptor
实例添加到OkHttpClient
实例中,但没有幸查看网络活动。下面是示例代码,演示了我尝试执行的操作:
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*
导入java.io.IOException
导入java.lang.Thread.sleep
趣味主线(args:Array){
val listener=object:WebSocketListener(){
覆盖消息(webSocket:webSocket?,文本:字符串?){
println(“获取服务器消息:$text”)
}
}
val dummy拦截器=拦截器{chain->
val request=chain.request()
val响应=链。继续(请求)
println(“触发了伪侦听器!\n\n请求:${request.headers()}\n响应:${response.headers()}”)
return@Interceptor回应
}
val dummyNetworkInterceptor=拦截器{chain->
val request=chain.request()
val响应=链。继续(请求)
println(“启动了虚拟网络侦听器!\n\n请求:${request.headers()}\n响应:${response.headers()}”)
return@Interceptor回应
}
val okHttpClient=okHttpClient.Builder()
.addInterceptor(Dummy拦截器)
.addNetworkInterceptor(dummyNetworkInterceptor)
.build()
val request=request.Builder().url(“ws://echo.websocket.org”).build()
val webSocket=okHttpClient.newWebSocket(请求,侦听器)
发送(“Hello1!”)
发送(“Hello2!”)
发送(“Hello3!”)
sleep(2000)//仅针对此示例,以确保完成所有WS-Request
println(“\n\n\t某些网络活动\n\n”)
okHttpClient.newCall(Request.Builder().get().url(“http://echo.websocket.org“”.build()).enqueue(对象:回调{
覆盖失效(调用:调用?,exc:IOException?){
println(“OnFailure:${exc?.message}”)
}
覆盖fun onResponse(调用:调用?,响应:响应?){
println(“OnResponse:${response?.headers()}”)
}
})
}
我试图深入研究okhttp3源代码,但没有找到任何理由说明我的任何拦截器没有对WS-requests发出请求,而是对任何OkHttpClient
请求都非常有效
这是okhttp3中的一个bug,还是我做错了什么,或者使用
okhttp3无法监视WS请求。拦截器?使用OkHttp进行的WebSocket调用不使用HTTP调用所使用的拦截器链,因此您无法通过拦截器监视它们
我以前也遇到过这个问题,因此我查看了源代码,发现了以下内容:
- 常规HTTP调用通过
RealCall
类中的方法进行,该类非常清楚地为每个请求启动侦听器的链接调用
- 包含WebSocket处理实现的
okhttp3.internal.ws
包不包含与拦截器相关的代码
实际上,截取WebSocket请求的拦截器一开始就没有什么意义。您可以在拦截器中获得的请求
表示一个HTTP请求,这在此时是不可能的,OkHttp有一个功能请求,但没有得到太多的关注:所以……甚至不可能通过websocket记录请求和响应?@amitav13您始终可以围绕您的WS实例构建一个包装器,并在应用程序级别记录或截获通过它的所有请求和响应(即内部ping除外)。我的问题是关于使用现有内置的OkHttp
拦截器在网络级别拦截此类呼叫。