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

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

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

Начать курс

GraphQL библиотека Kotlin: полное руководство по работе с API

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

1. graphql-kotlin — серверная библиотека от Expedia Group

graphql-kotlin — это наиболее популярная библиотека для создания GraphQL серверов на Kotlin. Она полностью поддерживает все возможности GraphQL спецификации и отлично интегрируется с фреймворками Spring Boot, Ktor и Micronaut.

Установка и настройка

Для подключения библиотеки добавьте зависимость в build.gradle.kts:

dependencies {
    // Основная библиотека
    implementation("com.expediagroup:graphql-kotlin-spring-server:6.5.0")
    
    // Для генерации схемы из аннотаций
    implementation("com.expediagroup:graphql-kotlin-schema-generator:6.5.0")
}

Создание простого GraphQL API

Определим модель данных и resolver для запросов:

// Модель данных
data class User(val id: Int, val name: String, val email: String)

// Query resolver
class UserQuery : Query {
    fun getUser(id: Int): User? {
        return users.find { it.id == id }
    }
    
    companion object {
        val users = listOf(
            User(1, "Анна Петрова", "anna@example.com"),
            User(2, "Иван Сидоров", "ivan@example.com")
        )
    }
}

// Mutation resolver
class UserMutation : Mutation {
    fun createUser(name: String, email: String): User {
        val newUser = User(users.size + 1, name, email)
        users.add(newUser)
        return newUser
    }
}

Теперь зарегистрируем resolvers в конфигурации Spring Boot:

@Configuration
class GraphQLConfig {
    @Bean
    fun userQuery(): UserQuery = UserQuery()
    
    @Bean
    fun userMutation(): UserMutation = UserMutation()
}

Запросы к API

Пример GraphQL запроса:

query {
  getUser(id: 1) {
    name
    email
  }
}

Ответ будет содержать только запрошенные поля:

{
  "data": {
    "getUser": {
      "name": "Анна Петрова",
      "email": "anna@example.com"
    }
  }
}

2. Apollo Kotlin — клиентская библиотека для Android и JVM

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

Подключение библиотеки

dependencies {
    implementation("com.apollographql.apollo:apollo-runtime:3.8.0")
    implementation("com.apollographql.apollo:apollo-normalized-cache-sqlite:3.8.0")
}

Создание запроса

Сначала определите GraphQL запрос в файле GetUserQuery.graphql:

query GetUser($id: Int!) {
  getUser(id: $id) {
    id
    name
    email
  }
}

Затем используйте сгенерированный код в Kotlin:

val apolloClient = ApolloClient.builder()
    .serverUrl("http://localhost:8080/graphql")
    .build()

suspend fun fetchUser(userId: Int): User? {
    val response = apolloClient
        .query(GetUserQuery(userId))
        .execute()
    
    return response.data?.getUser?.let { user ->
        User(
            id = user.id,
            name = user.name,
            email = user.email
        )
    }
}

3. KGraphQL — легковесная библиотека для Ktor

KGraphQL — это минималистичная библиотека для создания GraphQL серверов в приложениях на Ktor. Она идеально подходит для микросервисов.

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

// Определение схемы
val schema = graphql {
    query("hello") {
        resolver { -> "Hello, World!" }
    }
    
    query("users") {
        resolver { -> listOf("Анна", "Иван", "Мария") }
    }
}

// Интеграция с Ktor
fun Application.graphQLModule() {
    install(ContentNegotiation) {
        json()
    }
    
    routing {
        post("/graphql") {
            val request = call.receive<GraphQLRequest>()
            val result = schema.execute(request.query)
            call.respond(result)
        }
    }
}

Сравнение библиотек

  • graphql-kotlin — лучший выбор для создания полноценного сервера с поддержкой всех

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