Ktor - Static content routing

不羁的心 提交于 2020-01-03 18:03:18

问题


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.

  1. 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

  1. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!