You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:37:15