Ktor 2.1.x中如何用Resources插件生成路径与URL?
从Ktor Resources生成路径/URL的标准方法
Ktor的Resources插件确实提供了类似Locations插件href的功能,可直接从Resource对象生成对应路径或完整URL,完全满足重定向等场景需求,具体用法如下:
1. 请求上下文内生成路径
在路由处理函数中,通过ApplicationCall的resources.href扩展函数即可快速生成路径:
针对你的资源定义示例
生成根路由路径(Clients)
在Clients.ID的路由处理逻辑中,要重定向到Clients根路由,代码如下:
get<Clients.ID> { _ -> val clientsRootPath = call.resources.href(Clients()) call.respondRedirect(clientsRootPath) }
执行后会生成路径/clients,并完成重定向。
生成带参数的子路由路径
如果需要生成某个具体客户端的详情路径,传入对应的Resource对象即可:
val clientDetailPath = call.resources.href(Clients.ID(Clients(), 1001)) // 生成路径:/clients/1001
2. 非请求上下文生成路径
如果需要在路由处理外(比如服务初始化、工具类)生成路径,可先获取Resources实例再调用href:
// 在Application配置中获取Resources实例 val resources = Resources(application) val clientsPath = resources.href(Clients())
3. 带查询参数的资源处理
如果Resource类包含查询参数,插件会自动生成带参数的路径:
@Serializable @Resource("clients") class Clients(val page: Int = 1, val pageSize: Int = 20)
生成分页路径示例:
val paginatedPath = call.resources.href(Clients(page = 3, pageSize = 15)) // 生成路径:/clients?page=3&pageSize=15
注意事项
- 所有Resource类必须添加
@Serializable注解,否则无法正确解析生成路径。 - 如果需要生成包含协议、域名的完整URL,可结合
UrlBuilder和当前请求的origin信息:
val fullUrl = call.url { path(call.resources.href(Clients())) } call.respondRedirect(fullUrl.toString())
内容的提问来源于stack exchange,提问作者Tuncer Erdogan
相关产品推荐
相关产品推荐

