如何使用OkHttp MockWebServer的Dispatcher?无法继承final类okhttp3.Dispatcher
问题解答
核心澄清:你混淆了两个不同的Dispatcher类
你提到的okhttp3.Dispatcher是OkHttp客户端负责调度请求执行的核心类,它被设为final是OkHttp的API设计决定(Java版本中同样是final),和Kotlin默认类为final无关,也不是回归问题。而MockWebServer文档中描述的Dispatcher是okhttp3.mockwebserver.Dispatcher——这才是用于MockWebServer处理请求的调度器类,它在当前OkHttp版本中支持继承或函数式配置。
正确使用MockWebServer Dispatcher的两种方式
1. 继承okhttp3.mockwebserver.Dispatcher重写处理逻辑
import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.RecordedRequest class CustomMockDispatcher : Dispatcher() { override fun dispatch(request: RecordedRequest): MockResponse { return when (request.path) { "/user/profile" -> MockResponse().setBody("{\"name\":\"test\"}").setResponseCode(200) "/api/data" -> MockResponse().setBody("empty").setResponseCode(204) else -> MockResponse().setResponseCode(404) } } } // 给MockWebServer设置自定义Dispatcher mockWebServer.dispatcher = CustomMockDispatcher()
2. 使用函数式API(OkHttp 4.10+版本支持)
无需继承,直接通过lambda表达式配置请求处理逻辑:
import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse mockWebServer.dispatcher = Dispatcher { request -> when (request.path) { "/user/profile" -> MockResponse().setBody("{\"name\":\"test\"}").setResponseCode(200) else -> MockResponse().setResponseCode(404) } }
补充说明
如果是旧版文档示例引导你继承okhttp3.Dispatcher,那是文档内容滞后导致的误导——二者功能完全不同,切勿混淆包名。
内容的提问来源于stack exchange,提问作者julaine
相关产品推荐
相关产品推荐

