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
相关产品推荐
相关产品推荐

