Skip to content

GraphQL

Implements GraphQL over HTTP. Single POST /graphql endpoint with query and mutation routing. The serializer filters response fields to match the client’s selection set.

  • Spec: graphql.org
  • MIME: application/json
  • Serializer: GraphQLSerializer
  • Routing: Body-matched (single endpoint)
import crate.protocols.graphql.policy;
auto crateRouter = router.crateSetup!GraphQL;
crateRouter.add(userCrate);

All operations use POST /graphql:

Queries:

  • user(id: ID!): User — get one
  • users: [User] — list all

Mutations:

  • createUser(input: UserInput!): User
  • updateUser(id: ID!, input: UserInput!): User
  • replaceUser(id: ID!, input: UserInput!): User
  • deleteUser(id: ID!): Boolean

Query:

{
"query": "{ users { _id name email } }"
}

Mutation:

{
"query": "mutation { createUser(input: { name: \"Alice\" }) { _id name } }"
}

The GraphQLSerializer filters the response to only include fields requested in the selection set. If you query { users { _id name } }, the response omits email and other fields.

GraphQL registers a base operation via onRouterInit to handle schema introspection queries. The schema is built from all registered models.

  • Subscriptions: No WebSocket subscription support
  • Fragments: No named fragment support
  • Introspection: No __schema or __type queries
  • Custom scalars: No custom scalar type definitions
  • Directives: No @deprecated, @skip, @include, or custom directives
  • Union / interface types: Not supported
  • Batched queries: No multiple queries per request
auto crateRouter = router.crateSetup!(GraphQLPolicy!(PolicyConfig("/api")));
// Endpoint at POST /api/graphql