API GraphQL con Kotlin: tutorial práctico paso a paso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué GraphQL y Kotlin?

\n

En el mundo del desarrollo web moderno, elegir el enfoque correcto para crear una API puede determinar el éxito de todo el proyecto. GraphQL, desarrollado por Facebook, ofrece una alternativa flexible a REST, permitiendo a los clientes solicitar solo los datos que realmente necesitan. Y Kotlin, un lenguaje de programación moderno para la JVM, añade a esto concisión, seguridad contra nulos y un potente soporte para corrutinas.

\n

En este tutorial crearemos en la práctica una API GraphQL completa utilizando Kotlin y el framework graphql-kotlin-spring-server. Aprenderá a configurar el servidor, definir el esquema de datos, escribir resolutores y probar la API. Al final del artículo, podrá implementar GraphQL de forma independiente en sus proyectos con Kotlin.

\n\n

1. Configuración del proyecto y dependencias

\n

Para empezar, crearemos un nuevo proyecto en Spring Boot con soporte para GraphQL. Usaremos Gradle como sistema de compilación.

\n\n

1.1. Creación de la estructura base

\n

Cree un nuevo proyecto en IntelliJ IDEA o a través de Spring Initializr. Agregue las siguientes dependencias en build.gradle.kts:

\n
plugins {\n    id("org.springframework.boot") version "3.2.0"\n    id("io.spring.dependency-management") version "1.1.4"\n    kotlin("jvm") version "1.9.21"\n    kotlin("plugin.spring") version "1.9.21"\n}\n\ndependencies {\n    implementation("org.springframework.boot:spring-boot-starter-web")\n    implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.1")\n    implementation("org.jetbrains.kotlin:kotlin-reflect")\n    implementation("org.jetbrains.kotlin:kotlin-stdlib")\n    testImplementation("org.springframework.boot:spring-boot-starter-test")\n}
\n\n

1.2. Configuración de la aplicación

\n

Cree el archivo application.yml en src/main/resources:

\n
server:\n  port: 8080\n\ngraphql:\n  packages:\n    - "com.example.graphqldemo"\n  schema:\n    introspection-enabled: true\n    exception-handlers-enabled: true
\n

Esta es la configuración básica. El parámetro introspection-enabled: true permite usar GraphiQL para pruebas.

\n\n

2. Definición del esquema GraphQL

\n

En graphql-kotlin, el esquema se construye automáticamente basándose en sus clases de datos (data classes). Esta es una de las principales ventajas: no es necesario escribir un archivo SDL separado.

\n\n

2.1. Creación del modelo de datos

\n

Supongamos que estamos creando una API para una biblioteca de libros. Definamos los modelos:

\n
package com.example.graphqldemo.model\n\ndata class Book(\n    val id: String,\n    val title: String,\n    val author: Author,\n    val year: Int,\n    val genre: String\n)\n\ndata class Author(\n    val id: String,\n    val name: String,\n    val books: List<Book> = emptyList()\n)\n\n// Tipos de entrada para mutaciones\ndata class BookInput(\n    val title: String,\n    val authorId: String,\n    val year: Int,\n    val genre: String\n)
\n\n

2.2. Servicio para trabajar con datos

\n

Creemos un servicio simple en memoria que almacenará los datos:

\n
package com.example.graphqldemo.service\n\nimport com.example.graphqldemo.model.Author\nimport com.example.graphqldemo.model.Book\nimport com.example.graphqldemo.model.BookInput\nimport org.springframework.stereotype.Service\nimport java.util.UUID\n\n@Service\nclass LibraryService {\n    private val authors = mutableListOf(\n        Author("1", "Joanne Rowling"),\n        Author("2", "George Orwell")\n    )\n    private val books = mutableListOf(\n        Book("1", "Harry Potter y la piedra filosofal", authors[0], 1997, "Fantasía"),\n        Book("2", "1984", authors[1], 1949, "Distopía")\n    )\n\n    fun getBooks(): List<Book> = books\n    fun getBookById(id: String): Book? = books.find { it.id == id }\n    fun getAuthors(): List<Author> = authors\n    fun addBook(input: BookInput): Book {\n        val author = authors.fin                

Blogs

Book Recommendations