科特林·克托的Web应用程序

介绍

免责声明:这篇ktor文章最初发布在《 Dzone Web开发指南》中,可以下载 这里.

当Google制造 科特林 一个 官方语言 适用于Android,几个月前在 Google I / O,该语言很快在Android世界中广受欢迎。但是在服务器方面,Kotlin尚未被广泛采用,当涉及到后端服务时,有些人似乎仍持谨慎态度。其他开发人员说,Kotlin已经足够成熟,我们可以安全地将其用于Java可能在其中发挥作用的任何服务器应用程序。
如果要使用Kotlin开发Web应用程序,则可以从各种Web框架中进行选择,例如Spring MVC / WebFlux,Vert.x,Vaadin,以及基本上所有可用于JVM的框架。除了提到的框架,还有 科特林特有的 可用于创建Web应用程序的库,称为Kotlin 克托。阅读本文之后,您将了解ktor及其优点,以及如何在Kotlin中快速开发Web应用程序。

科特林·克托

Web应用程序框架 克托本身是用Kotlin编写的,旨在提供一种工具,可以使用Kotlin快速创建Web应用程序。生成的软件可以托管在标准servlet容器(例如Tomcat)中,也可以独立存在于 净额 例如。无论您选择哪种托管方式,ktor都会大量使用Kotlin Coroutines,因此它是100%异步且主要是非阻塞地实现。 克托不会规定要使用的框架或工具,因此您可以选择所需的任何日志记录,DI或模板引擎。一般而言,该库的重量很轻,但仍可以通过插件机制进行扩展。
归功于Kotlin的最大优势之一是其提供类型安全的构建器的能力,也称为领域特定语言(DSL)。许多库已经提供DSL来替代标准API,例如Android lib 安科,科特林 html 建造者或刚发布的 春季5 框架。正如我们在即将到来的示例中看到的那样,ktor还利用了此类DSL,这使用户能够以非常声明性的方式定义Web应用程序的端点。

应用范例

在下面的内容中,我们将开发一个小型的RESTful(不确定,如果每个人都同意)Web服务, 克托. 的 service uses 一个 in-memory 资料库 with simple Person resources, which it exposes through a JSON API. Let's look at the components.

Person 资源库

According to the app's requirements, a resource "Person" is defined as a data class 一个 d the corresponding 资料库 as 一个 object, 科特林's way of applying the Singleton pattern to a class.


data class Person(val name: String, val age: Int){
    var id: Int? = null
}

的 resource has two simple properties, which need to be defined when a user creates a new object, whereas the id property is set later when stored in the 资料库.
Person 资料库 是相当不起眼的,不值得观察。它使用内部数据存储并提供常见的CRUD操作。

终点

Web应用程序最重要的部分是其端点的配置,显示为REST API。提供了以下端点:

终点HTTP方法描述
/persons得到Requests all Person resources
/persons/{id}得到Requests a specific Person resource 通过 its ID
/persons删除Requests all Person resources to be removed
/persons/{id}删除Requests a specific Person resource to be removed 通过 its ID
/persons开机自检Requests to store a new Person resource
/得到提供一个欢迎客户端的简单HTML页面

的 application won't support 一个 update operator via PUT.

用Ktor路由

现在,ktor开始使用其结构化DSL,该结构化DSL将用于定义先前显示的端点,该过程通常称为“路由”。让我们看看它是如何工作的:


fun Application.main() {
    install(DefaultHeaders)
    install(CORS) {
        maxAge = Duration.ofDays(1)
    }
    install(ContentNegotiation){
        register(ContentType.Application.Json, GsonConverter())
    }

    routing {
        get("/persons") {
            LOG.debug("Get all Person entities")
            call.respond(PersonRepo.getAll())
        }
    }
    // more routings
}

的 fundamental class in the 克托 library is Application, which represents a configured 一个 d eventually running web service instance. In the snippet, 一个 extension function main() is defined on Application, in which we can call functions defined in Application directly, without additional qualifiers. We do exactly that 通过 invoking install() multiple times, a function for adding certain ApplicationFeatures into the request processing pipeline of the application. 的se features are optional, 一个 d the user can choose from various types. 的 only interesting feature in the shown example is ContentNegotiation, which is used for the (de-)serialization of 科特林 objects to 一个 d from JSON, respectively. We use Gson as a backing technology.
的 routing itself is shown with the 得到 endpoint for retrieving all Person resources 这里. It's fairly straight-forward since the result of the 资料库 call getAll() is just delegated back to the client. 的 call.respond() invocation eventually reaches the GsonSupport feature taking care of transforming the Person into its JSON representation. 的 same happens for the remaining four REST endpoints, which are not shown explicitly 这里.

HTML构建器

克托的另一个很酷的功能是它与HTML生成器等其他Kotlin DSL集成,您可以在 的GitHub. By adding a single additional dependency to a 克托 app, this builder is useable with the extension function call.respondHtml(), which expects type-safe HTML as input. In the following example, we include a simple greeting to the readers, which the web service exposes as its index page.


get("/") {
    call.respondHtml {
        head {
            title("克托 应用范例")
        }
        body {
            h1 { +"Hello DZone Readers" }
            p {
                +"How are you doing?"
            }
        }
    }
}

开始申请

After having done the configuration of a 克托 application, there's still a need to start it through a regular main method. In the demo, a 净额 通过执行以下操作独立启动服务器:


fun main(args: Array) {
    embeddedServer(Netty, 8080, module = Application::main).start(wait = true)
}

的 starting is made pretty simple 通过 just calling the embeddedServer() method with a 净额 environment, a port 一个 d the module to be started, which happens to be the thingy defined in the Application.main() extension function from the previously shown example.

测验

A web framework or library is only applicable if it comes with integrated testing means, which 克托 actually does. Since the 得到 routing for retrieving all Person resources was already shown, let's have a look at how the endpoint can be tested.


@Test
fun getAllPersonsTest() = withTestApplication(Application::main) {
    val person = savePerson(gson.toJson(Person("Bert", 40)))
    val person2 = savePerson(gson.toJson(Person("Alice", 25)))
    handleRequest(HttpMethod.Get, "/persons") {
        addHeader("接受", json)
    }.response.let {
        assertEquals(HttpStatusCode.OK, it.status())
        val response = gson.fromJson(it.content, Array::class.java)
        response.forEach { println(it) }
        response.find { it.name == person.name } ?: fail()
        response.find { it.name == person2.name } ?: fail()
    }
    assertEquals(2, PersonRepo.getAll().size)
}

This one is quite simple: Two resource objects are added to the 资料库, then the 得到 request is executed 一个 d some assertions are done against the web service response. 的 important part is withTestApplication(), which 克托 offers through its testing module 一个 d makes it possible to directly test the Application.
本文基本上介绍了所有值得了解的ktor Web应用程序入门知识。有关更多详细信息,我建议 克托 主页或 样本 包含在ktor信息库中。

外卖

在本文中,我们了解了Kotlin Web服务库 克托 它提供了用于快速编写Kotlin轻量级Web应用程序的简单方法。 克托大量使用Kotlin的优美功能。它特别利用DSL,协程和扩展功能,所有这些使语言和ktor本身如此优雅。如果您想从Kotlin开始使用Web应用程序,那么ktor是一个很棒的工具,因为它遵循“简单易用,可用复杂”的原则,既简单又可扩展。
您可以在以下位置找到已开发的Web应用程序的完整源代码。 的GitHub.

关于2个想法“科特林·克托的Web应用程序

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *