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()
}