Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IO Extended Luanda 2024

IO Extended Luanda 2024

Como construir uma Restful API em Kotlin, uma palestra apresentada no Google IO Extended 2024, organizado pelo GDG Luanda, com foco em Kotlin para backend.

Manuel Ernesto

July 13, 2024
Tweet

More Decks by Manuel Ernesto

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. • 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
  10. • 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
  11. 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
  12. application { mainClass.set("com.example.ApplicationKt") val isDevelopment: Boolean = project.ext.has("development") applicationDefaultJvmArgs =

    listOf("-Dio.ktor.development=$isDevelopment") } repositories {mavenCentral()} build.gradle.kts
  13. fun main() { embeddedServer( Netty, port = 8080, host =

    "0.0.0.0", module = Application::module) .start(wait = true)} fun Application.module() { configureSerialization() configureRouting() } Application.kt
  14. 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
  15. @Serializable data class Movie(val id: Int, val title: String, val

    year: Int) val db = mutableListOf<Movie>() Movie.kt
  16. fun Application.configureRouting() { routing { //outras funcoes post("/movies") { val

    movie = call.receive<Movie>() db.add(movie) call.respondText( "Movies added!", status = HttpStatusCode.Created) } } } Routing.kt
  17. fun Application.configureRouting() { routing { //outras funcoes get("/movies") { if

    (db.isEmpty()) call.respondText("No movies in database!") else call.respond(db) } } } Routing.kt
  18. 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
  19. fun Application.configureRouting() { routing { //outras funcoes put("/movies/{id}") { val

    movie = call.receive<Movie>() 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
  20. 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
  21. 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
  22. curl -X GET --location "http://0.0.0.0:8080/movies" \ -H "Accept: application/json" [

    { "id": 1, "title": "Iron Man", "year": 2008 } ] GET RESPONSE
  23. 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
  24. 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
  25. 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
  26. 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
  27. Q&A