如何使用okhttp3.Interceptor捕获OKHTTP3WebSocket网络活动?

如何使用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

我有一个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<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
拦截器在网络级别拦截此类呼叫。