GraphQL для Kotlin: мощные библиотеки для создания API

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

GraphQL библиотеки для Kotlin: полный обзор и практическое руководство

GraphQL — это язык запросов для API, который позволяет клиентам получать только те данные, которые им действительно нужны. В экосистеме Kotlin существует несколько мощных библиотек для работы с GraphQL, как на стороне сервера, так и на стороне клиента. В этой статье мы рассмотрим три ключевые библиотеки: graphql-kotlin, KGraphQL и Apollo Kotlin, а также покажем примеры их использования.

1. graphql-kotlin — официальная библиотека от Expedia Group

graphql-kotlin — это наиболее зрелая и поддерживаемая библиотека для создания GraphQL серверов на Kotlin. Она полностью использует возможности языка, такие как корутины, data классы и null-safety.

Основные возможности:

  • Поддержка корутин Kotlin для асинхронной обработки
  • Автоматическая генерация схемы из data классов
  • Встроенная поддержка подписок (Subscriptions) через WebSocket
  • Интеграция с Spring Boot, Ktor и другими фреймворками
  • Полная поддержка спецификации GraphQL June 2018

Пример сервера на graphql-kotlin:

// Определяем модель данных
data class User(val id: String, val name: String, val email: String)

// Создаем Query resolver
class UserQuery : Query {
    fun getUser(id: String): User? {
        // Логика получения пользователя
        return User(id = "1", name = "Иван Петров", email = "ivan@example.com")
    }
    
    fun users(): List<User> = listOf(
        User("1", "Иван", "ivan@example.com"),
        User("2", "Мария", "maria@example.com")
    )
}

// Настройка и запуск сервера
fun main() {
    val schema = Schema {
        query(UserQuery())
    }
    
    val server = GraphQLServer(schema)
    server.start(port = 8080)
}

Пример клиентского запроса:

query {
  user(id: "1") {
    name
    email
  }
}

2. KGraphQL — легковесная альтернатива

KGraphQL — это минималистичная библиотека для создания GraphQL API. Она отличается простотой настройки и отсутствием лишних зависимостей.

Ключевые особенности:

  • Минимальный размер — около 100 КБ
  • Не требует Spring Boot или других тяжелых фреймворков
  • Поддержка DSL для определения схемы
  • Возможность интеграции с любым HTTP сервером

Пример использования KGraphQL:

// Определяем модель
data class Product(val id: Int, val title: String, val price: Double)

// Создаем GraphQL схему
val schema = schema {
    query("products") {
        resolver { -> 
            listOf(
                Product(1, "Ноутбук", 89999.99),
                Product(2, "Мышь", 2499.50)
            )
        }
    }
    
    query("product") {
        resolver { id: Int ->
            Product(id, "Товар #$id", 1000.0)
        }
    }
}

// Запуск сервера
fun main() {
    val server = KGraphQLServer(schema)
    server.start(port = 4000)
}

3. Apollo Kotlin — клиентская библиотека от Apollo

Apollo Kotlin — это мощный клиент для работы с GraphQL API. Он генерирует типобезопасный код на основе схемы GraphQL, что значительно упрощает разработку.

Преимущества Apollo Kotlin:

  • Генерация Kotlin кода из .graphql файлов
  • Поддержка кэширования (нормализованный кэш)
  • Работа с корутинами и Flow
  • Автоматическая обработка ошибок
  • Поддержка мутаций, запросов и подписок

Пример использования Apollo Kotlin на клиенте:

// Сначала определяем запрос в .graphql файле
// file: GetUser.graphql
// query GetUser($id: ID!) {
//   user(id: $id) {
//     id
//     name
//     email
//   }
// }

// Затем используем сгенерированный код
class UserRepository(private val apolloClient: ApolloClient) {
    
    suspend fun getUser(id: String): User? {
        val response = apolloClient
            .query(GetUserQuery(id = id))
            .execute()
        
        return response.data?.user?.let { userData ->
            User(
                id = userData.id,
                name = userData.name,
                email = userData.email
            )
        }
    }
}

// Настройка клиента
fun createApolloClient(): ApolloClient {
    return ApolloClient.Builder()
        .serverUrl("http://localhost:8080/graphql")
        .build()
}

4. Сравнение библиоте

Рекомендаций