master
master v0.17.61 v0.17.60 v0.17.59 v0.17.58 v0.17.57 v0.17.56 v0.17.55 v0.17.54 v0.17.53 v0.17.52 v0.17.51 v0.17.50 v0.17.49 v0.17.48 v0.17.47 v0.17.46 v0.17.45 v0.17.44 v0.17.43 v0.17.42

Introspection

Enabling introspection
[edit]
You are looking at the docs for the unreleased master branch. The latest version is v0.17.61.

One of the best features of GraphQL is it’s powerful discoverability, known as introspection. Introspection allows clients to query the server’s schema about itself, and is the foundation of many tools like GraphiQL and Apollo Studio.

Enabling introspection

To enable introspection for the whole server, you use the bundled middleware extension github.com/99designs/gqlgen/graphql/handler/extension.Introspection:

srv := handler.New(es)

// Add server setup.
srv.AddTransport(transport.Options{})
srv.AddTransport(transport.POST{})

// Add the introspection middleware.
srv.Use(extension.Introspection{})

To opt in to introspection for certain environments, you can just guard the middleware with an environment variable:

srv := handler.New(es)

// Server setup...

if os.Getenv("ENVIRONMENT") == "development" {
    srv.Use(extension.Introspection{})
}

Disabling introspection based on authentication

Introspection can also be guarded on a per-request context basis. For example, you can disable it in a middleware based on user authentication:

srv := handler.New(es)

// Server setup...

srv.Use(extension.Introspection{})
srv.AroundOperations(func(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler {
    if !userForContext(ctx).IsAdmin {
        graphql.GetOperationContext(ctx).DisableIntrospection = true
    }

    return next(ctx)
})