Many different programming languages support GraphQL. This list contains some of the more popular server-side frameworks, client libraries, and other useful stuff.
The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.
To run a GraphQL.js
hello world script from the command line:
npm install graphql
Then run node hello.js
with this code in hello.js
:
var { graphql, buildSchema } = require('graphql'); var schema = buildSchema(` type Query { hello: String } `); var root = { hello: () => 'Hello world!' }; graphql(schema, '{ hello }', root).then((response) => { console.log(response); });
The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.
To run an express-graphql
hello world server:
npm install express express-graphql graphql
Then run node server.js
with this code in server.js
:
var express = require('express'); var graphqlHTTP = require('express-graphql'); var { buildSchema } = require('graphql'); var schema = buildSchema(` type Query { hello: String } `); var root = { hello: () => 'Hello world!' }; var app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).
To run a hello world server with graphql-server-express:
npm install graphql-server-express body-parser express graphql graphql-tools
Then run node server.js
with this code in server.js
:
var express = require('express'); var bodyParser = require('body-parser'); var { graphqlExpress, graphiqlExpress } = require('graphql-server-express'); var { makeExecutableSchema } = require('graphql-tools'); var typeDefs = [` type Query { hello: String } schema { query: Query }`]; var resolvers = { Query: { hello(root) { return 'world'; } } }; var schema = makeExecutableSchema({typeDefs, resolvers}); var app = express(); app.use('/graphql', bodyParser.json(), graphqlExpress({schema})); app.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'})); app.listen(4000, () => console.log('Now browse to localhost:4000/graphiql'));
GraphQL Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI and Koa.
A Ruby library for building GraphQL APIs.
To run a hello world script with graphql-ruby
:
gem install graphql
Then run ruby hello.rb
with this code in hello.rb
:
require 'graphql' QueryType = GraphQL::ObjectType.define do name 'Query' field :hello do type types.String resolve -> (obj, args, ctx) { 'Hello world!' } end end Schema = GraphQL::Schema.define do query QueryType end puts Schema.execute('{ hello }')
There are also nice bindings for Relay and Rails.
A Python library for building GraphQL APIs.
To run a Graphene hello world script:
pip install graphene
Then run python hello.py
with this code in hello.py
:
import graphene class Query(graphene.ObjectType): hello = graphene.String() def resolve_hello(self, args, context, info): return 'Hello world!' schema = graphene.Schema(query=Query) result = schema.execute('{ hello }') print(result.data['hello'])
There are also nice bindings for Relay, Django, SQLAlchemy, and Google App Engine.
An example of a hello world GraphQL schema and query with sangria
:
import sangria.schema._ import sangria.execution._ import sangria.macros._ val QueryType = ObjectType("Query", fields[Unit, Unit]( Field("hello", StringType, resolve = _ ⇒ "Hello world!") )) val schema = Schema(QueryType) val query = graphql"{ hello }" Executor.execute(schema, query) map println
A Java library for building GraphQL APIs.
Code that executes a hello world GraphQL query with graphql-java
:
import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import static graphql.Scalars.GraphQLString; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; public class HelloWorld { public static void main(String[] args) { GraphQLObjectType queryType = newObject() .name("helloWorldQuery") .field(newFieldDefinition() .type(GraphQLString) .name("hello") .staticValue("world")) .build(); GraphQLSchema schema = GraphQLSchema.newSchema() .query(queryType) .build(); Map<String, Object> result = new GraphQL(schema).execute("{hello}").getData(); System.out.println(result); // Prints: {hello=world} } }
See the graphql-java docs for more information on setup.
A set of reusable GraphQL components for Clojure conforming to the data structures given in alumbra.spec.
(require '[alumbra.core :as alumbra] '[claro.data :as data]) (def schema "type Person { name: String!, friends: [Person!]! } type QueryRoot { person(id: ID!): Person, me: Person! } schema { query: QueryRoot }") (defrecord Person [id] data/Resolvable (resolve! [_ _] {:name (str "Person #" id) :friends (map ->Person (range (inc id) (+ id 3)))})) (def QueryRoot {:person (map->Person {}) :me (map->Person {:id 0})}) (def app (alumbra/handler {:schema schema :query QueryRoot})) (defonce my-graphql-server (aleph.http/start-server #'app {:port 3000}))
$ curl -XPOST "http://0:3000" -H'Content-Type: application/json' -d'{ "query": "{ me { name, friends { name } } }" }' {"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}}
A Clojure library that provides a GraphQL implementation.
Code that executes a hello world GraphQL query with graphql-clj
:
(def schema "type QueryRoot { hello: String }") (defn resolver-fn [type-name field-name] (get-in {"QueryRoot" {"hello" (fn [context parent & rest] "Hello world!")}} [type-name field-name])) (require '[graphql-clj.executor :as executor]) (executor/execute nil schema resolver-fn "{ hello }")