首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用okhttp3捕获okhttp3 WebSocket网络活动?

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

Stack Overflow用户
提问于 2018-02-18 20:24:35
回答 2查看 2.1K关注 0票数 2

我有一个okhttp3 (3.9.1) WebSocket实例,并且希望查看它的所有网络请求和响应。我试图在OkHttpClient实例上创建WebSocket之前添加一些WebSocket实例,但在查看网络活动方面没有成功。下面的示例代码演示了我所做的工作:

代码语言:javascript
复制
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请求是不可能的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 20:56:41

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

在我之前,我就面临过这个问题,所以我查看了源代码,然后发现了以下内容:

  • 常规的HTTP调用通过getResponseWithInterceptorChain()类中的RealCall方法,它非常清楚地为每个请求启动拦截器的链式调用。
  • 包含WebSocket处理实现的WebSocket包不包含与拦截器相关的代码。

实际上,拦截器捕获WebSocket请求从一开始就没有意义。您可以在拦截器中获得的Request表示一个WebSocket messages are not请求。

票数 2
EN

Stack Overflow用户

发布于 2019-07-29 04:05:51

这是不可能的,在这一点上,有一个特性请求为OkHttp打开,但它没有得到太多的牵引力:https://github.com/square/okhttp/issues/4192

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48856206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档