Slide 1

Slide 1 text

@manuelernest0 Como construir uma Restful API em Kotlin

Slide 2

Slide 2 text

Kotlin

Slide 3

Slide 3 text

Ecossistema abrangente para construir aplicações Java/Kotlin, oferecendo recursos como injeção de dependências, inversão de controle e suporte a diversas tecnologias. Framework leve e flexível em Kotlin para a criação de aplicações web e APIs. Spring Ktor Framework moderno para a JVM, projetado para construir microsserviços e aplicações serverless de forma rápida e eficiente. MICRONAUT Framework Java nativo para Kubernetes, otimizado para iniciar rapidamente e consumir pouca memória. Framework reativo para a JVM que permite criar aplicações escaláveis e de alta performance. QUARKUS VERT.X Framework leve e funcional para a criação de aplicações web em Kotlin. http4k Frameworks

Slide 4

Slide 4 text

Ecossistema abrangente para construir aplicações Java/Kotlin, oferecendo recursos como injeção de dependências, inversão de controle e suporte a diversas tecnologias. Framework leve e flexível em Kotlin para a criação de aplicações web e APIs. Spring Ktor Framework moderno para a JVM, projetado para construir microsserviços e aplicações serverless de forma rápida e eficiente. MICRONAUT Framework Java nativo para Kubernetes, otimizado para iniciar rapidamente e consumir pouca memória. Framework reativo para a JVM que permite criar aplicações escaláveis e de alta performance. QUARKUS VERT.X Framework leve e funcional para a criação de aplicações web em Kotlin. http4k Frameworks

Slide 5

Slide 5 text

Framework leve e flexível construída do zero usando Kotlin e Coroutine, que nos permite criar aplicativos de cliente e servidor assíncronos facilmente. Ktor

Slide 6

Slide 6 text

Framework leve e flexível construída do zero usando Kotlin e Coroutine, que nos permite criar aplicativos de cliente e servidor assíncronos facilmente. Ktor

Slide 7

Slide 7 text

Framework leve e flexível construída do zero usando Kotlin e Coroutine, que nos permite criar aplicativos de cliente e servidor assíncronos facilmente. Ktor

Slide 8

Slide 8 text

Framework leve e flexível construída do zero usando Kotlin e Coroutine, que nos permite criar aplicativos de cliente e servidor assíncronos facilmente. Ktor

Slide 9

Slide 9 text

Framework leve e flexível construída do zero usando Kotlin e Coroutine, que nos permite criar aplicativos de cliente e servidor assíncronos facilmente. Ktor

Slide 10

Slide 10 text

Ktor combina a elegância e expressividade do Kotlin com um design moderno e eficiente, tornando-o uma excelente opção para o desenvolvimento de aplicações web, microsserviços e APIs. Ktor

Slide 11

Slide 11 text

Spring ou Ktor O que escolher

Slide 12

Slide 12 text

● Projetos Empresariais e de Grande Escala ● Funcionalidades Integradas ● Suporte Corporativo e Comunidade ● Documentação e Recursos de Aprendizado ● Desenvolvimento em Kotlin ● Aplicações Assíncronas e de Alta Concorrência ● Simplicidade e Leveza ● Customização e Flexibilidade ● Projetos Multiplatform Spring Ktor Spring ou Ktor

Slide 13

Slide 13 text

● Projetos Empresariais e de Grande Escala ● Funcionalidades Integradas ● Suporte Corporativo e Comunidade ● Documentação e Recursos de Aprendizado ● Desenvolvimento em Kotlin ● Aplicações Assíncronas e de Alta Concorrência ● Simplicidade e Leveza ● Customização e Flexibilidade ● Projetos Multiplatform Spring Ktor Spring ou Ktor

Slide 14

Slide 14 text

Application

Slide 15

Slide 15 text

Application Tomcat Jetty Netty(default)

Slide 16

Slide 16 text

Application Tomcat Routing Jetty Netty(default)

Slide 17

Slide 17 text

Application Tomcat Routing Jetty Authentication Netty(default)

Slide 18

Slide 18 text

Application Tomcat Routing Jetty Authentication ContentNegotiation Netty(default)

Slide 19

Slide 19 text

Application Tomcat Routing Jetty Authentication ContentNegotiation Netty(default) Exposed

Slide 20

Slide 20 text

Setup 🛠

Slide 21

Slide 21 text

Setup 🛠 https://start.ktor.io/

Slide 22

Slide 22 text

Setup 🛠 https://start.ktor.io/

Slide 23

Slide 23 text

Code 󰝺

Slide 24

Slide 24 text

val kotlin_version: String by project val ktor_version: String by project val logback_version: String by project plugins { kotlin("jvm") version "2.0.0" kotlin("plugin.serialization") version "2.0.0" id("io.ktor.plugin") version "2.3.11" } group = "com.example" version = "0.0.1" build.gradle.kts

Slide 25

Slide 25 text

application { mainClass.set("com.example.ApplicationKt") val isDevelopment: Boolean = project.ext.has("development") applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment") } repositories {mavenCentral()} build.gradle.kts

Slide 26

Slide 26 text

dependencies { implementation("io.ktor:ktor-serialization-kotlinx-json") implementation("io.ktor:ktor-server-core-jvm") implementation("io.ktor:ktor-server-content-negotiation-jvm") implementation("io.ktor:ktor-server-netty-jvm") implementation("ch.qos.logback:logback-classic:$logback_version") testImplementation("io.ktor:ktor-server-tests-jvm") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") } build.gradle.kts

Slide 27

Slide 27 text

fun main() { embeddedServer( Netty, port = 8080, host = "0.0.0.0", module = Application::module) .start(wait = true)} fun Application.module() { configureSerialization() configureRouting() } Application.kt

Slide 28

Slide 28 text

fun Application.configureSerialization() { install(ContentNegotiation) { json() } } Serialization.kt

Slide 29

Slide 29 text

fun Application.configureRouting() { routing { get("/") { call.respondText("Hello GDG Luanda ") } } } Routing.kt

Slide 30

Slide 30 text

fun Application.configureRouting() { routing { get("/") { call.respondText("Hello GDG Luanda") } } } curl -X GET --location "http://0.0.0.0:8080" \ -H "Accept: application/json" Routing.kt GET

Slide 31

Slide 31 text

@Serializable data class Movie(val id: Int, val title: String, val year: Int) Movie.kt

Slide 32

Slide 32 text

@Serializable data class Movie(val id: Int, val title: String, val year: Int) val db = mutableListOf() Movie.kt

Slide 33

Slide 33 text

fun Application.configureRouting() { routing { //outras funcoes post("/movies") { val movie = call.receive() db.add(movie) call.respondText( "Movies added!", status = HttpStatusCode.Created) } } } Routing.kt

Slide 34

Slide 34 text

fun Application.configureRouting() { routing { //outras funcoes get("/movies") { if (db.isEmpty()) call.respondText("No movies in database!") else call.respond(db) } } } Routing.kt

Slide 35

Slide 35 text

fun Application.configureRouting() { routing { //outras funcoes get("/movies/{id}") { val id = call.parameters["id"] ?: return@get call.respond(HttpStatusCode.BadRequest) val movie = db.find { it.id == id.toInt() } ?: call.respond(HttpStatusCode.NotFound) call.respond(movie) } } } Routing.kt

Slide 36

Slide 36 text

fun Application.configureRouting() { routing { //outras funcoes put("/movies/{id}") { val movie = call.receive() val id = call.parameters["id"] ?: return@put call.respond(HttpStatusCode.BadRequest) val index = db.indexOfFirst { it.id == id.toInt() } if (index != -1) { db[index] = movie call.respondText("Movie successfully updated", status = HttpStatusCode.OK) } else { call.respondText("Movie not found!", status = HttpStatusCode.NotFound) } } } } Routing.kt

Slide 37

Slide 37 text

fun Application.configureRouting() { routing { //outras funcoes delete("/movies/{id}") { val id = call.parameters["id"] ?: return@delete call.respond(HttpStatusCode.BadRequest) if (db.removeIf { it.id == id.toInt() }) { call.respondText("Movie deleted", status = HttpStatusCode.NoContent) } else { call.respondText("Movie not found!", status = HttpStatusCode.NotFound) } } }} Routing.kt

Slide 38

Slide 38 text

Execute 󰝺

Slide 39

Slide 39 text

curl -X POST --location "http://0.0.0.0:8080/movies" \ -H "Content-Type: application/json" \ -d '{ "id": 1, "title": "Iron Man", "year": 2008 }' POST

Slide 40

Slide 40 text

curl -X POST --location "http://0.0.0.0:8080/movies" \ -H "Content-Type: application/json" \ -d '{ "id": 1, "title": "Iron Man", "year": 2008 }' Movies added to database! POST RESPONSE

Slide 41

Slide 41 text

curl -X GET --location "http://0.0.0.0:8080/movies" \ -H "Accept: application/json" GET

Slide 42

Slide 42 text

curl -X GET --location "http://0.0.0.0:8080/movies" \ -H "Accept: application/json" [ { "id": 1, "title": "Iron Man", "year": 2008 } ] GET RESPONSE

Slide 43

Slide 43 text

curl -X GET --location "http://0.0.0.0:8080/movies/2" \ -H "Accept: application/json" GET BY ID

Slide 44

Slide 44 text

curl -X GET --location "http://0.0.0.0:8080/movies/2" \ -H "Accept: application/json" { "id": 2, "title": "Deadpool & Wolverine", "year": 2024 } GET BY ID RESPONSE

Slide 45

Slide 45 text

curl -X DELETE --location "http://0.0.0.0:8080/movies/1" \ -H "Accept: application/json" DELETE

Slide 46

Slide 46 text

curl -X DELETE --location "http://0.0.0.0:8080/movies/1" \ -H "Accept: application/json" HTTP/1.1 204 No Content Content-Type: text/plain; charset=UTF-8 DELETE RESPONSE

Slide 47

Slide 47 text

curl -X PUT --location "http://0.0.0.0:8080/movies/2" \ -H "Content-Type: application/json" \ -d '{ "id": 2, "title": "Deadpool & Wolverine", "year": 2025 }' PUT

Slide 48

Slide 48 text

curl -X PUT --location "http://0.0.0.0:8080/movies/2" \ -H "Content-Type: application/json" \ -d '{ "id": 2, "title": "Deadpool & Wolverine", "year": 2025 }' Movie successfully updated Response code: 200 (OK); PUT RESPONSE

Slide 49

Slide 49 text

Q&A

Slide 50

Slide 50 text

Thank You Manuel Ernesto He/Him Kotlin/Java Developer