Ktor具有对提供静态内容的内置支持. 当您要提供样式表,脚本,图像等时,这很有用.
io.ktor.routing.Routing
类中io.ktor.routing.Routing
,不需要其他工件.
使用static
函数,我们可以告诉Ktor我们希望将某些URI视为静态内容,并定义该内容所处的位置. 所有内容均相对于当前工作目录. 请参阅定义自定义根文件夹以设置其他根.
routing {
static("static") {
files("css")
}
}
上面的示例告诉ktor
,对URI /static
任何请求都将被视为静态内容. files("css")
定义了这些文件所在的文件夹-将提供css
文件夹中的所有内容. 从本质上讲,这意味着诸如
/static/styles.css
将提供文件css/styles.css
.
除了文件夹之外,我们还可以使用file
包含特定文件,如果文件名不同,则可以选择第二个参数映射到实际的物理文件名.
routing {
static("static") {
files("css")
files("js")
file("image.png")
file("random.txt", "image.png")
default("index.html")
}
}
我们还可以有一个可以使用默认提供的文件default
. 例如,在致电时
/static
没有文件名,将提供index.html
.
要指定一个不同于工作目录的根文件夹,我们设置staticRootFolder
的值,该值需要为File
类型.
static("custom") {
staticRootFolder = File("/system/folder/docs")
files("public")
}
We can also define sub-routes, i.e. /static/themes
for instance
static("static") {
files("css")
static("themes") {
files("data")
}
}
如果将静态内容作为资源嵌入到应用程序中,则可以使用resource
和resources
功能从那里直接为它们提供服务:
static("static") {
resources("css")
resource("favicon.ico")
}
还有一个类似于default
defaultResource
,用于为文件夹提供默认页面;提供与staticBasePackage
相似的staticRootFolder
,用于为静态内容指定基本资源包.
如果找不到请求的内容,则抛出FileNotFoundException
. 应该在StatusPages
使用exception
处理程序对其进行处理,以生成相应的404 Not Found
,否则它将传播到引擎并导致500 Internal Server Error.
提供文件后,将使用ContentType.defaultForFile(file)
从文件扩展名确定内容类型. 从ktor-server-core
的mimelist.csv
资源文件获取与每种文件类型相对应的数据.
函数static
定义为
fun Route.static(remotePath: String, configure: Route.() -> Unit) = route(remotePath, configure)
这实际上只是另一条路线定义.
默认情况下,Ktor不处理HEAD
请求,因此静态内容功能也不处理HEAD
请求. 要自动处理每个GET
路由的HEAD
请求,可以安装AutoHeadResponse
功能 .
fun Application.main() {
// ...
install(AutoHeadResponse)
// ...
}
默认情况下不处理HEAD请求,这意味着如果将curl -I
或其curl --head
别名用于Ktor后端的GET路由而不安装AutoHeadResponse功能, 它将返回404 Not Found .