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

时间:2018-02-18 20:24:36

标签: websocket kotlin okhttp3

我有一个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请求?

2 个答案:

答案 0 :(得分:2)

使用OkHttp进行的WebSocket调用不使用HTTP调用的拦截链,因此您无法通过拦截器监视它们。

我之前已经遇到过这个问题,所以我查看了源代码并找到了以下内容:

  • 常规HTTP调用通过RealCall类中的pandas documentation方法,很明显地为每个请求启动了拦截器的链接调用。
  • 包含WebSocket处理实现的okhttp3.internal.ws包中不包含与拦截器相关的代码。

实际上,拦截器捕获WebSocket请求并不是真的有意义。您可以在拦截器中获取的Request表示HTTP请求,getResponseWithInterceptorChain()

答案 1 :(得分:0)

目前尚不可能,有一个针对OkHttp的功能请求,但是并没有太大的吸引力:https://github.com/square/okhttp/issues/4192