使用http4k的旧Kotlin应用如何自动爬取获取所有暴露的routes?
http4k应用路由自动采集与文档生成方案
核心实现逻辑
http4k的Routes类型本身是可遍历的树结构,不需要爬取运行中的服务,也不需要手动补充OpenAPI注解,直接在编译或启动阶段静态遍历所有模块暴露的路由根节点,就能拿到全量路由信息。
具体实现步骤
- 聚合全量路由根节点
先把各独立模块对外暴露的routes实例统一聚合到同一个集合中,比如定义全局变量allModulesRoutes: List<Routes>,把所有模块的路由根节点全部加入该集合。 - 递归遍历路由树提取接口信息
利用Routes自带的迭代能力递归遍历嵌套路由,直接提取每个接口的请求方法、路径模板、描述等信息,参考代码如下:import org.http4k.core.Method import org.http4k.routing.Routed import org.http4k.routing.Routes // 路由信息结构体,可根据需要扩展字段 data class RouteInfo( val method: Method, val fullPath: String, val description: String? = null ) fun collectRoutes(routes: Routes, parentPath: String = ""): List<RouteInfo> { return routes.flatMap { handler -> when (handler) { // 叶子节点为实际暴露的接口 is Routed -> listOf(RouteInfo(handler.method, parentPath + handler.path, handler.description)) // 嵌套路由递归处理 is Routes -> collectRoutes(handler, parentPath) else -> emptyList() } } } // 调用示例,输出全量路由列表 val allRoutes = allModulesRoutes.flatMap { collectRoutes(it) } - 导出类OpenAPI格式文档
拿到全量RouteInfo列表后,可直接按照OpenAPI的Schema结构生成JSON或YAML文件,基础的路径、请求方法字段可直接填充,如果原有路由定义了description也可以直接带入文档。 - 集成到工作流
可以把路由采集逻辑做成独立启动参数,比如应用启动时传入--export-routes就自动生成并导出文档,也可以集成到CI流水线中,每次构建自动生成最新的路由文档,无需人工维护。
优化建议
- 如果需要补充请求/响应结构信息,可配合http4k自带的
Contract路由定义,原有路由不需要大面积修改,仅给接口补充请求响应的Lens定义,采集时就能自动拿到参数、返回体结构,生成的文档完整度和手动编写的OpenAPI一致。 - 没有加Contract定义的老接口,也可以通过反射读取处理器的输入输出类型,补全文档字段。
内容的提问来源于stack exchange,提问作者Rohit Sachan
相关产品推荐
相关产品推荐

