本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
在本文中,我们将讨论 Kotlin MVC 架构的一些高级主题和最佳实践。我们还将提供一些代码示例来说明这些概念。
Kotlin MVC 架构最重要的方面之一是如何正确处理请求。有两种方法可以做到这一点:通过过滤器和处理程序。
过滤器用于在处理程序处理请求之前预处理请求。这对于身份验证和授权、输入验证和日志记录等任务很有用。
过滤器在应用程序的配置
文件中注册:
// Register a filter for all requests
configuration.addFilter("MyFilter", "/*") {
// ...
}
// Register a filter for specific requests
configuration.addFilter("MyFilter", "/my-path") {
// ...
}
一旦过滤器被注册,它就会被所有匹配的请求调用。过滤器可以访问请求的Parameters
、Headers
和Body
。它还可以在请求上设置Headers
和Attributes
,处理程序可以使用它们。
这是一个记录所有请求的过滤器的简单示例:
class RequestLoggingFilter : Filter {
override fun invoke(call: Call, next: Next) {
val request = call.request
val path = request.path
val method = request.method
val query = request.queryString
val headers = request.headers.entries.joinToString { "${it.key}: ${it.value}" }
val body = request.body.asText()
val log = "$method $path $query $headers $body"
println(log)
// Invoke the next filter or handler in the chain
next(call)
}
}
此过滤器将请求方法、路径、查询字符串、标头和正文记录到控制台。
处理程序用于处理请求和生成响应。他们可以访问请求的“参数”、“标头”、“属性”和“正文”。
处理程序在应用程序的配置
文件中注册:
// Register a handler for all requests
configuration.addHandler("MyHandler", "/*") {
// ...
}
// Register a handler for specific requests
configuration.addHandler("MyHandler", "/my-path") {
// ...
}
注册处理程序后,将为所有匹配的请求调用它。处理程序可以在响应上设置Headers
和Attributes
,过滤器和其他处理程序可以使用它们。
这是一个返回“Hello, World!”的处理程序的简单示例。回复:
class HelloWorldHandler : Handler {
override fun invoke(call: Call) {
val response = call.response
response.status = Status.OK
response.body = "Hello, World!"
}
}
此处理程序将响应状态设置为 200 OK
并将正文设置为“Hello, World!”。
路由用于将请求映射到处理程序。有两种方法可以做到这一点:通过配置和代码。
路由可以在应用程序的配置
文件中配置:
configuration.addRoute("MyRoute", "/my-path") {
// ...
}
一旦路由被注册,它将被所有匹配的请求调用。该路由可以访问请求的Parameters
、Headers
和Body
。它还可以在请求上设置Headers
和Attributes
,过滤器和处理程序可以使用它们。
这是一个将请求映射到“Hello, World!”的路由的简单示例。处理程序:
class HelloWorldRoute : Route {
override fun invoke(call: Call, next: Next) {
val request = call.request
val path = request.path
if (path == "/hello-world") {
val handler = HelloWorldHandler()
handler(call)
} else {
// Invoke the next route in the chain
next(call)
}
}
}
该路由检查请求路径。如果它是“/hello-world”,它会调用“Hello, World!”处理程序。否则,它调用链中的下一个路由。
路由也可以在代码中完成:
val route = Route {
// ...
}
configuration.addRoute(route)
一旦路由被注册,它将被所有匹配的请求调用。该路由可以访问请求的Parameters
、Headers
和Body
。它还可以在请求上设置Headers
和Attributes
,过滤器和处理程序可以使用它们。
这是一个将请求映射到“Hello, World!”的路由的简单示例。处理程序:
val route = Route {
val request = it.request
val path = request.path
if (path == "/hello-world") {
val handler = HelloWorldHandler()
handler(it)
} else {
// Invoke the next route in the chain
it.next()
}
}
该路由检查请求路径。如果它是“/hello-world”,它会调用“Hello, World!”处理程序。否则,它调用链中的下一个路由。
以下是使用 Kotlin MVC 架构时要牢记的一些一般最佳实践: