Kotlinx Serialization
Example focusing on the usage of kotlinx.serialization with OpenAPI specification generation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 | @file:OptIn(ExperimentalSerializationApi::class)
package io.github.smiley4.ktoropenapi.examples
import io.github.smiley4.ktoropenapi.OpenApi
import io.github.smiley4.ktoropenapi.config.ExampleEncoder
import io.github.smiley4.ktoropenapi.config.SchemaGenerator
import io.github.smiley4.ktoropenapi.get
import io.github.smiley4.ktoropenapi.openApi
import io.github.smiley4.ktorredoc.redoc
import io.github.smiley4.ktorswaggerui.swaggerUI
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.Application
import io.ktor.server.application.install
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import io.ktor.server.response.respondText
import io.ktor.server.routing.route
import io.ktor.server.routing.routing
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonNamingStrategy
fun main() {
embeddedServer(Netty, port = 8080, host = "localhost", module = Application::myModule).start(wait = true)
}
private fun Application.myModule() {
val json = Json {
prettyPrint = true
encodeDefaults = true
explicitNulls = false
namingStrategy = JsonNamingStrategy.SnakeCase
}
install(OpenApi) {
schemas {
// configure the schema generator to use the default kotlinx-serializer
generator = SchemaGenerator.kotlinx(json)
}
examples {
// configure the example encoder to encode kotlin objects using kotlinx-serializer
exampleEncoder = ExampleEncoder.kotlinx(json)
}
}
routing {
// add the routes for the OpenAPI spec, Swagger UI and ReDoc
route("swagger") {
swaggerUI("/api.json")
}
route("api.json") {
openApi()
}
route("redoc") {
redoc("/api.json")
}
// a documented route
get("hello", {
description = "A Hello-World route"
request {
queryParameter<String>("name") {
description = "the name to greet"
example("Name Parameter") {
value = "Mr. Example"
}
}
}
response {
code(HttpStatusCode.OK) {
description = "successful request - always returns 'Hello World!'"
body<TestResponse> {
example("Success Response") {
value = TestResponse(
name = "Mr. Example",
length = 11
)
}
}
}
}
}) {
call.respondText("Hello ${call.request.queryParameters["name"]}")
}
}
}
@Serializable
data class TestResponse(
val name: String,
val length: Int,
)
|