GraphQL 已有多种编程语言支持。下表包含一些流行的服务端框架、客户端库、服务和其他有用的内容。
除了 GraphQL JavaScript 参考实现,还有其他服务端库:
using System; using GraphQL; using GraphQL.Types; public class Program { public static void Main(string[] args) { var schema = Schema.For(@" type Query { hello: String } "); var json = schema.Execute(_ => { _.Query = "{ hello }"; _.Root = new { Hello = "Hello World!" }; }); Console.WriteLine(json); } }
一套 Clojure 的 GraphQL 可复用组件,满足 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"}]}}}
一个提供 GraphQL 实现的 Clojure 库。
可以执行一个 hello world
GraphQL 查询的 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 }")
一套 GraphQL 规范的完整实现,致力于维护对规范的外部兼容。
核心库 —— GORM GraphQL 库提供了基于你的 GORM 实体来生成 GraphQL schema 的功能。除了能够将域类映射到 GraphQL schema 之外,核心库还提供了通过 schema 的执行来查询、更新和删除数据的“数据访问者”的默认实现。
Grails 插件 —— 作为对核心库的补充,GORM GraphQL Grails 插件能够:
更多信息请查看 文档。
GQL 是一个在 Groovy 中使用 GraphQL 的库。
一个用于构建 GraphQL API 的 Java 库。
可以执行一个 hello world
GraphQL 查询的 graphql-java
代码如下:
import graphql.ExecutionResult; import graphql.GraphQL; import graphql.schema.GraphQLSchema; import graphql.schema.StaticDataFetcher; import graphql.schema.idl.RuntimeWiring; import graphql.schema.idl.SchemaGenerator; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring; public class HelloWorld { public static void main(String[] args) { String schema = "type Query{hello: String} schema{query: Query}"; SchemaParser schemaParser = new SchemaParser(); TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); RuntimeWiring runtimeWiring = new RuntimeWiring() .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world"))) .build(); SchemaGenerator schemaGenerator = new SchemaGenerator(); GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring); GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); ExecutionResult executionResult = build.execute("{hello}"); System.out.println(executionResult.getData().toString()); // Prints: {hello=world} } }
查看 graphql-java 文档 以了解更多信息。
GraphQL 规范的参考实现,设计用于在 Node.js 环境中运行。
如果要在命令行中运行一个 GraphQL.js
的 hello world
脚本:
npm install graphql
然后使用 node hello.js
以运行 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); });
基于 Express webserver 服务器的一个 GraphQL API 服务端参考实现,你可以用它结合常规 Express webserver 来运行 GraphQL,也可以作为独立 GraphQL 服务器。
如果要运行 express-graphql
的 hello world 服务器:
npm install express express-graphql graphql
然后使用 node server.js
以运行 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'));
来自于 Apollo 的一套 GraphQL server 包,可用于多种 Node.js HTTP 框架(Express,Connect,Hapi,Koa 等)。
如果要运行 apollo-server-express
的 hello world 服务器:
npm install apollo-server-express express
然后使用 node server.js
以运行 server.js
中的代码:
const express = require('express'); const { ApolloServer, gql } = require('apollo-server-express'); const typeDefs = gql` type Query { hello: String } `; const resolvers = { Query: { hello: () => 'Hello world!', }, }; const server = new ApolloServer({ typeDefs, resolvers }); const app = express(); server.applyMiddleware({ app }); app.listen({ port: 4000 }, () => console.log('Now browse to http://localhost:4000' + server.graphqlPath) );
Apollo Server 也支持所有的 Node.js HTTP 服务器框架:Express、Connect、HAPI 和 Koa。
API Platform 是一个基于 Symfony 构建的功能齐全、灵活且可扩展的 API 框架。 以下的类足以创建与 Relay 兼容的 GraphQL 服务器和支持现代 REST 格式(JSON-LD、JSONAPI...)的超媒体 API:
<?php namespace AppEntity; use ApiPlatformCoreAnnotationApiResource; use DoctrineORMMapping as ORM; /** * Greet someone! * * @ApiResource * @ORMEntity */ class Greeting { /** * @ORMId * @ORMColumn(type="guid") */ public $id; /** * @var string Your nice message * * @ORMColumn */ public $hello; }
API Platform 的其他功能还包括数据验证、身份验证、授权、弃用、缓存和 GraphiQL 集成。
Siler 是一个具有高级抽象功能,可与 GraphQL 搭配使用的 PHP 库。
如果要运行 Siler 的 hello world 脚本:
type Query {
hello: String
}
<?php declare(strict_types=1); require_once '/path/to/vendor/autoload.php'; use SilerDiactoros; use SilerGraphql; use SilerHttp; $typeDefs = file_get_contents(__DIR__.'/schema.graphql'); $resolvers = [ 'Query' => [ 'hello' => 'world', ], ]; $schema = Graphqlschema($typeDefs, $resolvers); echo "Server running at http://127.0.0.1:8080"; Httpserver(Graphqlpsr7($schema), function (Throwable $err) { var_dump($err); return Diactorosjson([ 'error' => true, 'message' => $err->getMessage(), ]); })()->run();
它还根据 Apollo 的工作原理提供了构建 WebSocket 订阅服务器的功能。
一个用于构建 GraphQL API 的 Python 库。
如果要运行一个 Graphene hello world 脚本:
pip install graphene
然后使用 python hello.py
以运行 hello.py
中的代码:
import graphene class Query(graphene.ObjectType): hello = graphene.String(name=graphene.String(default_value="World")) def resolve_hello(self, info, name): return 'Hello ' + name schema = graphene.Schema(query=Query) result = schema.execute('{ hello }') print(result.data['hello']) # "Hello World"
其也有对 Relay、Django、SQLAlchemy 和 Google App Engine 的良好绑定。
一个用于构建 GraphQL API 的 Ruby 库。
如果要使用 graphql-ruby
运行一个 hello world 脚本:
gem install graphql
然后使用 ruby hello.rb
运行 hello.rb
中的代码:
require 'graphql' class QueryType < GraphQL::Schema::Object graphql_name 'Query' field :hello do type types.String resolve -> (obj, args, ctx) { 'Hello world!' } end end class Schema < GraphQL::Schema query QueryType end puts Schema.execute('{ hello }').to_json
其也有对于 Relay 和 Rails 的良好绑定。
使用的 sangria
的一个 GraphQL schema 以及 hello world 查询:
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
fetch
的轻度封装。