Problem Statement:
How can I persist query?
How to cache my query results?
How to Update my queries?
Requirement:
Provide details on how to add the persist graphql query, cache the results from graphql and update the persisted query
Provide curl commands to execute in terminal or on postman
Introduction:
Persisted Queries (Caching)
After preparing a query with a POST request, it can be executed with a GET request that can be cached by HTTP caches or a CDN.
This is required as POST queries are usually not cached, and if using GET with the query as a parameter there is a significant risk of the parameter becoming too large for HTTP services and intermediates.
Persisted queries must always use the endpoint related to the appropriate Sites configuration; so, they can use either, or both:
- Specific Sites configuration and endpoint
Creating a persisted query for a specific Sites configuration requires a corresponding Sites-configuration-specific endpoint (to provide access to the related Content Fragment Models).
For example, to create a persisted query specifically for the SampleGraphQL Sites configuration:
a corresponding SampleGraphQL-specific Sites configuration
- Go to the tools section for the aem and general section and select Configuration Browser as shown below

- Add select the conf folder and go to the properties and make GraphQL Persistent Queries checkbox is checked

a SampleGraphQL-specific endpoint must be created in advance.
- Go to tools section for the aem and assets section and select GraphQL as shown below

- Add the new end point as shown below:

Add the following CORS configurations for the GraphQL API calls:

Register graphql search path:

Here are the steps required to persist a given query:
Prepare the query by putting it to the new endpoint URL /graphql/persist.json/<config>/<persisted-label>.
For example, create a persisted query:
curl -u admin:admin -X PUT 'http://localhost:4502/graphql/persist.json/SampleGraphQL/cities' \
--header 'Content-Type: application/json' \
--data-raw '{
cityList {
items {
_path
name
country
population
}
}
}'
- At this point, check the response.
For example, check for success:
{
"action": "create",
"configurationName": "SampleGraphQL",
"name": "cities",
"shortPath": "/SampleGraphQL/cities",
"path": "/conf/SampleGraphQL/settings/graphql/persistentQueries/cities"
}
You can then replay the persisted query by getting the URL /graphql/execute.json/<shortPath>.
For example, use the persisted query:
curl -u admin:admin -X GET 'http://localhost:4502/graphql/execute.json/SampleGraphQL/cities' \
--header 'Authorization: Basic YWRtaW46YWRtaW4='
Update a persisted query by POSTing to an already existing query path.
For example, use the persisted query:
curl -u admin:admin -X POST 'http://localhost:4502/graphql/persist.json/SampleGraphQL/cities' \
--header 'Content-Type: application/json' \
--data-raw '{
cityList {
items {
_path
name
country
population
}
}
}'
Create a wrapped plain query.
For example:
curl -u admin:admin -X PUT 'http://localhost:4502/graphql/persist.json/SampleGraphQL/plain-cities' \
--header 'Content-Type: application/json' \
--data-raw '{ "query": "{cityList { items { _path name country country population } } }"}'
Create a wrapped plain query with cache control.
For example:
curl -u admin:admin -X PUT 'http://localhost:4502/graphql/persist.json/SampleGraphQL/plain-cities-max-age' \
--header 'Content-Type: application/json' \
--data-raw '{ "query": "{cityList { items { _path name country country population } } }", "cache-control": { "max-age": 300 }}'
Create a persisted query with parameters:
For example:
curl -u admin:admin -X PUT 'http://localhost:4502/graphql/persist.json/SampleGraphQL/plain-cities-query-parameters' \
--header 'Content-Type: application/json' \
--data-raw \
'query GetAsGraphqlModelTestByPath($apath: String!) {
cityByPath(_path: $apath) {
item {
_path
name
country
population
}
}
}'
Executing a query with parameters.
For example:
curl -u admin:admin -X POST \
-H "Content-Type: application/json" \
"http://localhost:4502/graphql/execute.json/SampleGraphQL/plain-cities-query-parameters;apath=%2Fcontent%2Fdam%2Fsample-content-fragments%2Fcities%2Fberlin"
curl -u admin:admin -X GET \
"http://localhost:4502/graphql/execute.json/SampleGraphQL/plain-cities-query-parameters;apath=%2Fcontent%2Fdam%2Fsample-content-fragments%2Fcities%2Fberlin"