Retrieve a GraphQL Schema¶
🕵️ Enable Introspection¶
Enabling Introspection on Your Application¶
Using Apollo¶
When creating a new instance of the ApolloServer, you have to provide an object describing your resolvers and type definitions. This object can also include an introspection parameter.
This option is documented in the ApolloServer reference
Fine-tuning¶
Using Apollo plugins, you can also have better access control over this query. Here is an example of a plugin that prevents access to the introspection query if the request does not feature the CLI header.
const introspectionPlugin = {
requestDidStart() {
return {
async willSendResponse(requestContext) {
const { request, response } = requestContext;
if (request.http.headers.get('x-cli-access') !== 'true') {
if (request.operationName === 'IntrospectionQuery') {
response.data = null;
response.errors = [
{
message: 'Introspection query not allowed',
extensions: {
code: 'FORBIDDEN'
}
}
];
}
}
}
};
}
}
Retrieving the Schema¶
You can retrieve the GraphQL schema using various methods:
Using cURL¶
curl --location 'https://example.com/graphql' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{"query":"query IntrospectionQuery { __schema { queryType { name } mutationType { name } subscriptionType { name } types { ...FullType } directives { name description locations args { ...InputValue } } } } fragment FullType on __Type { kind name description fields(includeDeprecated: true) { name description args { ...InputValue } type { ...TypeRef } isDeprecated deprecationReason } inputFields { ...InputValue } interfaces { ...TypeRef } enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason } possibleTypes { ...TypeRef } } fragment InputValue on __InputValue { name description type { ...TypeRef } defaultValue } fragment TypeRef on __Type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } } } ","variables":{}}' \
> introspection.json