问题
I would love to understand better how Ktor is handling the routing for static content. I have the following hierarchy in my static folder (working directory):
- static
- index.html
- (some files)
- static
- css (directory)
- js (directory)
- (some files)
I'd like to serve all of them. So I was using directly this code in routing
:
static {
defaultResource("index.html", "static")
resources("static")
}
Which works very well, but the issue is that it's taking the hand on all requests including my small get
:
get("/smoketest"){
call.respondText("smoke test!", ContentType.Text.Plain)
}
What would be the best to handle in general the static content in Ktor?
Here is the code
Thank you
回答1:
I tried reproducing it locally and made it work with two different approaches.
- Put one of these in your static block
file("*", "index.html") // single star will only resolve the first part
file("{...}", "index.html") // tailcard will match anything
- Or, put the following get handler as your last route:
val html = File("index.html").readText()
get("{...}") {
call.respondText(html, ContentType.Text.Html)
}
The {...}
is a tailcard and matches any request that hasn't been matched yet.
Documentation available here: http://ktor.io/features/routing.html#path
Edit: For resources I made the following work:
fun Route.staticContent() {
static {
resource("/", "index.html")
resource("*", "index.html")
static("static") {
resources("static")
}
}
}
I can't see your static files in the repository, so here is what it looks like in my project:
来源:https://stackoverflow.com/questions/50901472/ktor-static-content-routing