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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:37:06