Kotlin上的GraphQL:服务器端开发的库与工具概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin上的GraphQL:库与工具完全指南



GraphQL是一种API查询语言,也是一个用于执行这些查询的运行时环境,可配合您现有的数据使用。它允许客户端精确请求所需的数据,因此成为REST的有力替代方案。在Kotlin生态系统中,有多个成熟的库可用于构建GraphQL服务端。本文将详细解析主要工具、它们的语法及使用示例。



为什么选择Kotlin开发GraphQL?

Kotlin作为运行在JVM上的静态类型语言,非常适合构建类型安全的GraphQL模式。Kotlin编译器有助于在编码阶段避免错误,而富有表现力的语法使代码清晰简洁。Kotlin中用于GraphQL的主要库包括:

  • graphql-kotlin(来自Expedia Group)——最流行的库,与Spring Boot紧密集成。
  • KGraphQL——另一种选择,注重简单配置和极简API。
  • Apollo Kotlin——面向Android和KMP的客户端库,但也提供服务端能力。


graphql-kotlin库

graphql-kotlin是一组用于在Kotlin上构建GraphQL服务器的库。其主要方法是使用注解和data类自动生成模式。



安装

在build.gradle.kts中添加依赖:

dependencies {    implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.0")    implementation("com.expediagroup:graphql-kotlin-schema-generator:7.0.0")}


示例:简单查询

定义data类和解析器:

import com.expediagroup.graphql.server.operations.Query

data class User(val id: Int, val name: String, val email: String)

class UserQuery : Query { fun getUser(id: Int): User { // 模拟从数据库获取 return User(id = id, name = "Alice", email = "alice@example.com") }}


graphql-kotlin会自动生成模式。现在客户端可以执行查询:

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


响应将只包含请求的字段:

{  "data": {    "getUser": {      "name": "Alice",      "email": "alice@example.com"    }  }}


变更(数据修改)

变更使用Mutation接口:

import com.expediagroup.graphql.server.operations.Mutation

class UserMutation : Mutation { fun createUser(name: String, email: String): User { // 创建用户的逻辑 return User(id = 2, name = name, email = email) }}


对应的查询:

mutation {  createUser(name: "Bob", email: "bob@example.com") {    id    name  }}


KGraphQL库

KGraphQL提供更偏向DSL的方法,无需注解。模式通过编程方式构建。



安装

dependencies {    implementation("com.apurebase:kgraphql:0.18.0")    implementation("com.apurebase:kgraphql-ktor:0.18.0") // 用于Ktor}


示例:定义模式

import com.apurebase.kgraphql.schema.dsl.SchemaBuilder

val schema = SchemaBuilder { query("hello") { resolver { -> "Hello, World!" } }

query("user") { resolver { id: Int -> User(id = id, name = "Charlie", email = "charlie@example.com") } }

mutation("createUser") { resolver { name: String, email: String -> User(id = 3, name = name, email = email) } }}


然后连接到Web框架

推荐