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

