Client Overview
graphql-kotlin-client is a lightweight type-safe GraphQL HTTP client. Type-safe data models are generated at build time
by the GraphQL Kotlin Gradle and
Maven plugins.
GraphQLClient is a thin wrapper on top of Ktor HTTP Client and supports fully
asynchronous non-blocking communication. It is highly customizable and can be configured with any supported Ktor HTTP
engine and features.
Project Configuration
GraphQL Kotlin provides both Gradle and Maven plugins to automatically generate your client code at build time. Once
your data classes are generated, you can then execute their underlying GraphQL operations using graphql-kotlin-client
runtime dependency.
Basic build.gradle.kts Gradle configuration:
import com.expediagroup.graphql.plugin.gradle.graphql
plugins {
id("com.expediagroup.graphql") version $latestGraphQLKotlinVersion
}
dependencies {
implementation("com.expediagroup:graphql-kotlin-client:$latestGraphQLKotlinVersion")
}
graphql {
client {
endpoint = "http://localhost:8080/graphql"
packageName = "com.example.generated"
}
}
Equivalent pom.xml Maven configuration
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>graphql-kotlin-maven-client-example</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<graphql-kotlin.version>$latestGraphQLKotlinVersion</graphql-kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-client</artifactId>
<version>${graphql-kotlin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-maven-plugin</artifactId>
<version>${graphql-kotlin.version}</version>
<executions>
<execution>
<id>generate-graphql-client</id>
<goals>
<goal>introspect-schema</goal>
<goal>generate-client</goal>
</goals>
<configuration>
<endpoint>http://localhost:8080/graphql</endpoint>
<packageName>com.example.generated</packageName>
<schemaFile>${project.build.directory}/schema.graphql</schemaFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
See graphql-kotlin-client-example project for complete working examples of Gradle and Maven based projects.
Generating GraphQL Client
By default, GraphQL Kotlin build plugins will attempt to generate GraphQL clients from all *.graphql files located under
src/main/resources. Queries are validated against the target GraphQL schema, which can be manually provided, retrieved by
the plugins through introspection (as configured in examples above) or downloaded directly from a custom SDL endpoint.
See our documentation for more details on supported Gradle tasks
and Maven Mojos.
When creating your GraphQL queries make sure to always specify an operation name and name the files accordingly. Each
one of your query files will generate a corresponding Kotlin file with a class matching your operation
name that will act as a wrapper for all corresponding data classes. For example, given HelloWorldQuery.graphql with
HelloWorldQuery as the operation name, GraphQL Kotlin plugins will generate a corresponding HelloWorldQuery.kt file
with a HelloWorldQuery class under the configured package.
For example, given a simple schema
type Query {
helloWorld: String
}
And a corresponding HelloWorldQuery.graphql query
query HelloWorldQuery {
helloWorld
}
Plugins will generate following client code
package com.example.generated
import com.expediagroup.graphql.client.GraphQLClient
import com.expediagroup.graphql.types.GraphQLResponse
import kotlin.String
const val HELLO_WORLD_QUERY: String = "query HelloWorldQuery {\n helloWorld\n}"
class HelloWorldQuery(
private val graphQLClient: GraphQLClient
) {
suspend fun execute(): GraphQLResponse<HelloWorldQuery.Result> =
graphQLClient.execute(HELLO_WORLD_QUERY, "HelloWorldQuery", null)
data class Result(
val helloWorld: String
)
}
Generated classes requires an instance of GraphQLClient and exposes a single execute suspendable method that executes
the underlying GraphQL operation using the provided client.
Executing Queries
Your auto generated classes accept an instance of GraphQLClient which is a thin wrapper around Ktor HTTP client that
ensures proper serialization and deserialization of your GraphQL objects. GraphQLClient requires target URL to be
specified and defaults to fully asynchronous non-blocking Coroutine-based IO engine.
package com.example.client
import com.expediagroup.graphql.client.GraphQLClient
import com.expediagroup.graphql.generated.HelloWorldQuery
import kotlinx.coroutines.runBlocking
import java.net.URL
fun main() {
val client = GraphQLClient(url = URL("http://localhost:8080/graphql"))
val helloWorldQuery = HelloWorldQuery(client)
runBlocking {
val result = helloWorldQuery.execute()
println("hello world query result: ${result.data?.helloWorld}")
}
client.close()
}