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 库。
用 graphql-clj
实现的 Hello World 代码:
(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 }")
A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.
Core Library - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of "data fetchers" to query, update, and delete data through executions of the schema.
Grails Plugin - In a addition to the Core Library, the GORM GraphQL Grails Plugin:
See the documentation for more information.
GQL is a Groovy library for GraphQL
用于构建GraphQL API的Java库.
用 graphql-java
实现的 hello world 代码:
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 而设计.
通过 命令行 执行 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 实现的 GraphQL 参考实现, 你可以联合 Express 运行或独立运行.
运行一个 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 服务器软件包, 可与各种Node.js HTTP框架(Express, Connect, Hapi, Koa等)配合工作.
To run a hello world server with apollo-server-express:
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 also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.
API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony. The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):
<?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; }
Other API Platform features include data validation, authentication, authorization, deprecations, cache and GraphiQL integration.
GraphQLite is a library that offers an annotations-based syntax for GraphQL schema definition. It is framework agnostic with bindings available for Symfony and Laravel.
This code declares a "product" query and a "Product" Type:
class ProductController { /** * @Query() */ public function product(string $id): Product { // Some code that looks for a product and returns it. } } /** * @Type() */ class Product { /** * @Field() */ public function getName(): string { return $this->name; } // ... }
Other GraphQLite features include validation, security, error handling, loading via data-loader pattern...
Siler is a PHP library powered with high-level abstractions to work with GraphQL.
To run a Siler hello world script:
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();
It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.
用于构建 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 也很好的支持绑定.
A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.
require 'agoo' class Query def hello 'hello' end end class Schema attr_reader :query def initialize @query = Query.new() end end Agoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql') Agoo::Server.start() Agoo::GraphQL.schema(Schema.new) { Agoo::GraphQL.load(%^type Query { hello: String }^) } sleep # To run this GraphQL example type the following then go to a browser and enter # a URL of localhost:6464/graphql?query={hello} # # ruby hello.rb
用 sangria
实现的一个模型和查询 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
Apollo Android: Java 实现支持强类型和缓存的 GraphQL 客户端.
Nodes: A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.
fetch
.