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

Ktor testApplication环境下无法移除请求Accept Header的解决方案咨询

如何在Ktor的testApplication中彻底移除Accept请求头

我之前升级Ktor到2.x版本后也碰到过一模一样的问题!问题根源在于Ktor的HttpClient默认安装了DefaultRequest插件——这个插件会在请求发送前自动添加包括Accept: */*在内的默认请求头,而且它的执行时机晚于你在单个请求的headers块里的配置,所以你直接调用remove(HttpHeaders.Accept)根本没用,插件之后又会把这个头重新加回来。

下面给你两种可行的解决方案:

方案1:使用请求拦截器(推荐)

通过onSend拦截器在请求即将发送的最后一步移除Accept头,这个时机在所有默认头添加完成之后,能确保修改生效:

fun `my test`() = testApplication {
    val response = client.request("/v1/mytest") {
        method = HttpMethod.Get
        addClientVersionHeaders()
        // 在请求发送前拦截并移除Accept头
        onSend { request ->
            request.copy(headers = request.headers.remove(HttpHeaders.Accept))
        }
    }
    snapshotter.matchWithSnapshot(response)
}

方案2:修改Client的默认配置

如果你希望整个测试用的client都不自动添加Accept头,可以在创建client时修改DefaultRequest插件的配置,直接移除默认的Accept头:

fun `my test`() = testApplication {
    // 创建自定义配置的client
    val customClient = createClient {
        install(DefaultRequest) {
            // 移除DefaultRequest插件默认添加的Accept头
            headers.remove(HttpHeaders.Accept)
        }
    }

    val response = customClient.request("/v1/mytest") {
        method = HttpMethod.Get
        addClientVersionHeaders()
        // 这里不需要再单独处理headers了
    }
    snapshotter.matchWithSnapshot(response)
}

注意事项

  • 不要直接禁用DefaultRequest插件,因为它还负责处理其他默认行为(比如Content-Type的默认值),可能会导致其他测试出现异常。
  • 如果你只需要针对单个请求移除Accept头,方案1更灵活;如果多个测试场景都需要移除,方案2可以减少重复代码。

内容的提问来源于stack exchange,提问作者Amadeu Cavalcante Filho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:18:12