Docs
Try Apollo Studio

HTTP cache


This page focuses on the HTTP cache. If you want to deduplicate the storage of your objects and/or notify your UI when your data changes, take a look at the normalized cache instead.

ℹ️ The HTTP cache is only available on the JVM.

Setup

To enable HTTP cache support, add the dependency to your project's build.gradle file:

build.gradle[.kts]
dependencies {
implementation("com.apollographql.apollo3:apollo-http-cache:3.3.0")
}

If you're targeting Android API level < 26, you'll need to enable core library desugaring to support the java.time API:

android {
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled = true
// Sets Java compatibility to Java 8
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}

Then configure your HTTP cache:

apolloClient = ApolloClient.Builder()
.httpCache(
// Use a dedicated directory for the cache
directory = File(pathToCacheDirectory),
// Configure a max size of 100MB
maxSize = 100 * 1024 * 1024
)
.build()

Usage

The HTTP cache is a least recently used (LRU) cache with a configurable max size.

Once your cache setup is complete, the cache will be used by default by all your queries. By default, queries will try to find a result in the cache first and go the network if it's not there. This is the HttpFetchPolicy.CacheFirst. You can customize that behaviour with httpFetchPolicy(HttpFetchPolicy):

val response = apolloClient.query(query)
// Don't use the cache
.httpFetchPolicy(HttpFetchPolicy.NetworkOnly)
// Or only use the cache
.httpFetchPolicy(HttpFetchPolicy.CacheOnly)
// Finally, execute your query
.execute()

If the query is present in cache, it will be used to return response.data. If not, a HttpCacheMissException will be thrown.

You can also set an expiration time either globally or for specific queries. The entries will automatically be removed from the cache after the expiration time:

// Globally
apolloClient = ApolloClient.Builder()
.httpCache(/*...*/)
// Expire after 1 hour
.httpExpireTimeout(60 * 60 * 1000)
.build()
// On a specific query
val response = apolloClient.query(query)
// Expire after 1 hour
.httpExpireTimeout(60 * 60 * 1000)
.execute()

If a specific query must not be cached, you can use httpDoNotStore():

val response = apolloClient.query(query)
// Don't cache this query
.httpDoNotStore(httpDoNotStore = true)
.execute()

Clearing the cache

Call apolloClient.httpCache.clearAll() to clear the cache of all entries.

Edit on GitHub
Previous
ApolloStore
Next
Persisted queries