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

Ktor集成测试自定义主机名和端口返回404问题排查

Ktor测试自定义主机名与8080端口匹配问题修复

问题根源在于Host请求头的匹配规则:当你在路由中指定host("example.com", port = 8080)时,Ktor要求请求的Host头必须包含完整的example.com:8080才能命中路由,但你当前请求只传递了example.com,导致路由匹配失败返回404。

之前的特殊场景能正常工作的原因:

  • 用80端口时,HTTP默认端口可在Host头中省略,Ktor会自动匹配
  • 用port=0表示匹配所有端口,无论Host头是否带端口都能命中
  • 用localhost时,测试客户端默认会自动带上localhost:8080的Host头,刚好匹配路由规则

修复后的测试代码

只需要修改请求的Host头,添加对应的端口即可:

class MyApplicationTest {

    @Test
    fun testCustomHostnameAndPort() = testApplication {

        environment {
            connector {
                port = 8080
                host = "example.com"
            }
        }

        application {
            routing {
                host("example.com", port = 8080) {
                    get("/my-path") {
                        call.respond(HttpStatusCode.Accepted)
                    }
                }
            }
        }

        val response = client.get("http://example.com:8080/my-path") {
            header(HttpHeaders.Host, "example.com:8080") // 补充完整的主机名+端口
        }

        assertEquals(HttpStatusCode.Accepted, response.status)
    }
}

如果你的业务需要兼容带端口和不带端口的Host头(比如生产环境反向代理会剥离端口),可以添加多个host路由规则,或者让port参数接受范围值,但如果明确要限制到8080端口,上面的修改就能解决问题。

内容的提问来源于stack exchange,提问作者actonchart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:29:57