如何在Plumber API同时实现根路由静态文件与子路由接口挂载
解决Plumber同时挂载静态文件与接口端点的404问题
你遇到的问题是因为静态资源挂载到根路径/后,Plumber的路由匹配优先级导致/test请求被静态资源路由拦截,无法到达接口端点。当你把静态资源挂载到根路径时,所有根路径下的请求都会先经过这个静态资源路由,它会尝试在指定目录中查找对应文件,找不到就直接返回404,不会继续匹配后续的接口路由。
以下是两种可行的解决方案:
方案一:调整静态资源挂载路径,单独处理根路径返回index.html
这种方式将静态资源移到子路径,根路径单独返回首页文件,避免和接口路由冲突。
- 修改
init.R:
library(plumber) options(plumber.trailingSlash = TRUE) pr <- Plumber$new() # 根路径返回index.html pr <- pr %>% pr_get("/", function(res) { res$headers$`Content-Type` <- "text/html" readLines("api/assets/index.html", warn = FALSE) }) %>% # 静态资源挂载到/assets路径 pr_mount("/assets", plumb("api/assets.R")) %>% pr_mount("/test", plumb("api/test.R")) pr_run(pr, host = "0.0.0.0", port = 8080)
- 保持
api/assets.R不变:
#* Assets for front end #* @assets api/assets / list()
这样访问http://localhost:8080会返回index.html,静态资源(如css、js)可以通过/assets/xxx访问,/test接口正常返回数据。
方案二:使用pr_static并调整挂载顺序
pr_static是Plumber提供的更简洁的静态资源托管方式,通过调整挂载顺序让接口路由优先匹配。
修改init.R即可,无需api/assets.R文件:
library(plumber) options(plumber.trailingSlash = TRUE) pr <- Plumber$new() # 先挂载接口端点,再添加静态资源路由 pr <- pr %>% pr_mount("/test", plumb("api/test.R")) %>% pr_static("/", "api/assets") # 静态资源托管到根路径 pr_run(pr, host = "0.0.0.0", port = 8080)
这种方式下,Plumber会先匹配已定义的/test接口,匹配失败后再去查找静态资源,既保留了根路径返回index.html的需求,也能让/test接口正常工作。
内容的提问来源于stack exchange,提问作者Scido
相关产品推荐
相关产品推荐

