Launch Apollo Studio

Persisted queries in Apollo Kotlin


Automatic persisted queries

Apollo Kotlin supports Automatic Persisted Queries (APQ). To take advantage of this support, your GraphQL server also needs to support APQ (Apollo Server supports it out of the box).

Enable the feature when you initialize your ApolloClient instance, like so:

val apolloClient = ApolloClient.Builder()
  .serverUrl("https://...")
  .autoPersistedQueries()
  .build()

You can optionally configure apollo-android to send GET HTTP verbs for queries, to benefit from caching if your server uses a CDN:

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://...")
    .autoPersistedQueries(httpMethodForDocumentQueries = HttpMethod.Get)
    .build()

Disable persisted queries for some queries

You may want to disable server side caching like for some users data that is updated often. In order to do that, set hashedQuery to false like:

apolloClient.query(myQuery).enableAutoPersistedQueries(false).toFlow()

operationOutput.json

If your backend uses custom persisted queries, Apollo Kotlin can generate an OperationOutput json from your .graphql queries. They will match what the client is sending exactly so you can persist them on your server.

apollo {
  generateOperationOutput.set(true)
}

Custom ID for Persisted Queries

By default, Apollo uses Sha256 hashing algorithm to generate an ID for the query. To provide custom ID generation logic, use the option - operationIdGenerator which accepts an instance that implements the OperationIdGenerator interface (com.apollographql.apollo3.compiler.OperationIdGenerator) as the input. This option can be used to either specify a different hashing algorithm or to fetch the persisted query ID from a different place - e.g. a service or a CLI.

Example Md5 hash generator:

apollo {
    operationIdGenerator.set(object: com.apollographql.apollo3.compiler.OperationIdGenerator {
        override val version = "my-md5-version1"

        override fun apply(operationDocument: String, operationName: String): String {
            return operationDocument.md5()
        }
    })
}

Versioning Id Generator

The result of the ID generator is cached. The cache is not updated when the implementation of the ID Generator changes. To indicate an update to the implementation of the ID Generator, change the version override as shown in the above example.

Edit on GitHub