GraphQL

Code

GraphQL 已有多种编程语言支持。下表包含一些流行的服务端框架、客户端库、服务和其他有用的内容。

服务端库#

除了 GraphQL JavaScript 参考实现,还有其他服务端库:

C# / .NET#

graphql-dotnet:.NET 的 GraphQL 实现#

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);
}
}
  • graphql-net:转换 GraphQL 到 IQueryable
  • Entity GraphQL:针对 .NET Core 的 GraphQL 库。编译为 IQueryable 以轻松地从现有的数据模型(例如从 Entity Framework 数据模型)中暴露出 schema
  • DotNetGraphQLQueryGen:从 GraphQL schema 生成类,以在 dotnet 中进行类型安全的查询的 .NET Core 库
  • Hot Chocolate:针对 .NET core 和 .NET classic 的 GraphQL 服务器
  • NGraphQL:用于 .NET Core 和完整框架的 GraphQL 服务器

Clojure#

alumbra#

一套 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-clj#

一个提供 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 }")

lacinia#

一套 GraphQL 规范的完整实现,致力于维护对规范的外部兼容。

D#

  • graphqld:D 编程语言的 GraphQL 实现。

Elixir#

Erlang#

Go#

Groovy#

gorm-graphql#

核心库 —— GORM GraphQL 库提供了基于你的 GORM 实体来生成 GraphQL schema 的功能。除了能够将域类映射到 GraphQL schema 之外,核心库还提供了通过 schema 的执行来查询、更新和删除数据的“数据访问者”的默认实现。

Grails 插件 —— 作为对核心库的补充,GORM GraphQL Grails 插件能够:

  • 提供一个通过 HTTP 来接收和响应 GraphQL 请求的控制器。
  • 在启动时使用 spring bean 配置生成 schema,以便于扩展。
  • 包含一个在开发环境下默认启用的 GraphiQL 浏览器。这一浏览器可以在 /graphql/browser 下访问。
  • 使用 Grails 提供的数据绑定覆盖默认的数据绑定
  • 提供一个 特质 以使你更容易对 GraphQL 入口端点进行集成测试

更多信息请查看 文档

GQL#

GQL 是一个在 Groovy 中使用 GraphQL 的库。

Haskell#

Morpheus GraphQL#

用于构建 GraphQL API 的 Haskell 库。

一个使用 morpheus-graphql 的 hello world 示例:

# schema.gql
"""
A supernatural being considered divine and sacred
"""
type Deity {
name: String!
power: String @deprecated(reason: "no more supported")
}
type Query {
deity(name: String! = "Morpheus"): Deity!
}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module API (api) where
import Data.ByteString.Lazy.Char8 (ByteString)
import Data.Morpheus (interpreter)
import Data.Morpheus.Document (importGQLDocument)
import Data.Morpheus.Types (RootResolver (..), Undefined (..))
import Data.Text (Text)
importGQLDocument "schema.gql"
rootResolver :: RootResolver IO () Query Undefined Undefined
rootResolver =
RootResolver
{ queryResolver = Query {deity},
mutationResolver = Undefined,
subscriptionResolver = Undefined
}
where
deity DeityArgs {name} =
pure
Deity
{ name = pure name,
power = pure (Just "Shapeshifting")
}
api :: ByteString -> IO ByteString
api = interpreter rootResolver

查看 morpheus-graphql-examples 了解更复杂的 API。

Java#

graphql-java#

一个用于构建 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 文档 以了解更多信息。

JavaScript#

GraphQL.js (github) (npm)#

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-graphql (github) (npm)#

基于 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-server (github) (npm)#

来自于 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 和 NestJs。

Kotlin#

  • graphql-kotlin:一组用于在 Kotlin 中运行 GraphQL 服务器的库。
  • KGraphQL:设置 GraphQL 服务器的一个纯 Kotlin 实现。

Perl#

PHP#

  • graphql-php:GraphQL 参考实现的 PHP 移植版本
  • graphql-relay-php:一个用于辅助构建 graphql-php 服务器的库,支持 react-relay
  • Railt:一个 PHP GraphQL 框架
  • Lighthouse:一个用于 Laravel 的 GraphQL 服务器
  • GraphQLBundle:一个用于 Symfony 的 GraphQL 服务器
  • WPGraphQL:一个免费的开源 WordPress 插件,可为任何 WordPress 网站提供可扩展的 GraphQL schema 和 API
  • GraphQL API for WordPress:WordPress 的 GraphQL 服务器
  • GraPHPinator:现代 PHP 的一个 GraphQL 实现

API Platform (github)#

API Platform 是一个基于 Symfony 构建的功能齐全、灵活且可扩展的 API 框架。 以下的类足以创建与 Relay 兼容的 GraphQL 服务器和支持现代 REST 格式(JSON-LD、JSONAPI...)的超媒体 API:

<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
/**
* Greet someone!
*
* @ApiResource
* @ORM\Entity
*/
class Greeting
{
/**
* @ORM\Id
* @ORM\Column(type="guid")
*/
public $id;
/**
* @var string Your nice message
*
* @ORM\Column
*/
public $hello;
}

API Platform 的其他功能还包括数据验证、身份验证、授权、弃用、缓存和 GraphiQL 集成。

GraphQLite (github)#

GraphQLite 是一个为 GraphQL schema 定义提供基于注释的语法的库。 它与框架无关,可用于 Symfony 和 Laravel。

以下的代码声明了一个 “product” 查询和一个 “Product” 类型:

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;
}
// ...
}

GraphQLite 的其他功能包括验证、安全性、错误处理、通过数据加载器模式加载……

Siler (github)#

Siler 是一个具有高级抽象功能,可与 GraphQL 搭配使用的 PHP 库。

如果要运行 Siler 的 hello world 脚本:

type Query {
hello: String
}
<?php
declare(strict_types=1);
require_once '/path/to/vendor/autoload.php';
use Siler\Diactoros;
use Siler\Graphql;
use Siler\Http;
$typeDefs = file_get_contents(__DIR__.'/schema.graphql');
$resolvers = [
'Query' => [
'hello' => 'world',
],
];
$schema = Graphql\schema($typeDefs, $resolvers);
echo "Server running at http://127.0.0.1:8080";
Http\server(Graphql\psr7($schema), function (\Throwable $err) {
var_dump($err);
return Diactoros\json([
'error' => true,
'message' => $err->getMessage(),
]);
})()->run();

它还根据 Apollo 的工作原理提供了构建 WebSocket 订阅服务器的功能。

Swift#

  • Graphiti:一个 Swift 库,可快速、安全且轻松地构建 GraphQL schema/类型。

Python#

Graphene (github)#

一个用于构建 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 的良好绑定。

Ruby#

graphql-ruby#

一个用于构建 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 的良好绑定。

Agoo#

一个支持 GraphQL 的高性能 Web 服务器。Agoo 致力于为 GraphQL 提供一个简单易用的 API。

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

Rust#

Scala#

Sangria (github):支持 Relay 的一个 Scala GraphQL 库。#

使用的 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

OCaml / Reason#

ocaml-graphql-server:用于 OCaml 和 Reason 的 GraphQL 服务端库。#

GraphQL 客户端#

C# / .NET#

Clojurescript#

  • re-graph:一个在 Clojurescript 中实现的 GraphQL 客户端,支持 websockets。

Elixir#

Elm#

  • dillonkearns/elm-graphql:一个库和命令行代码生成器,用于为 GraphQL 入口端点创建类型安全的 Elm 代码。

Flutter#

  • graphql:一个 Flutter 中的 GraphQL 客户端实现。

Go#

  • graphql:一个使用 Go 编写的 GraphQL 客户端实现。
  • machinebox/graphql:用于 GraphQL 的一个优雅的底层 HTTP 客户端。

Haskell#

Java / Android#

  • Apollo Android:一个用于 JVM、Android 和 Kotlin native 的 GraphQL 客户端,强类型、带缓存功能。
  • Nodes:一个 GraphQL JVM 客户端,用于从标准模型定义构建查询。

JavaScript#

  • Relay (github) (npm):Facebook 的框架,用于构建与 GraphQL 后端交流的 React 应用。
  • Apollo Client (github):一个强大的 JavaScript GraphQL 客户端,设计用于与 React、React Native、Angular 2 或者原生 JavaScript 一同工作。
  • graphql-request:一个简单灵活的 JavaScript GraphQL 客户端,可以运行于所有的 JavaScript 环境(浏览器,Node.js 和 React Native)—— 基本上是 fetch 的轻度封装。
  • Lokka:一个简单的 JavaScript GraphQL 客户端,可以运行于所有的 JavaScript 环境 —— 浏览器,Node.js 和 React Native。
  • nanogql:一个使用模板字符串的小型 GraphQL 客户端库。
  • gq-loader:一个简单的 JavaScript GraphQL 客户端,通过 webpack 加载器让 *.gql 文件作为模块使用。
  • AWS Amplify:使用云服务进行应用开发的 JavaScript 库,支持 GraphQL 后端和用于处理 GraphQL 数据的 React 组件。
  • Grafoo:一个通用的 GraphQL 客户端,具有仅 1.6kb 的多框架的视图层集成。
  • urql (github):一个用于 React 的高度可定制且用途广泛的 GraphQL 客户端。
  • graphqurl (npm):带有自动完成功能、订阅和 GraphiQL 的 curl。也是一个简单通用的 javascript GraphQL 客户端。

Julia#

  • Diana.jl:一个 Julia GraphQL 服务端实现.

Kotlin#

  • graphql-kotlin:一组 GraphQL 库,包括一个轻量级、类型安全的 GraphQL HTTP 客户端。

Swift / Objective-C iOS#

  • Apollo iOS (github):一个用于 iOS 的 GraphQL 客户端,返回查询特定的 Swift 类型,与 Xcode 集成后可以分屏显示你的 Swift 源代码和 GraphQL,并能在行内展示验证错误。
  • GraphQL iOS:一个用于 iOS 的 Objective-C GraphQL 客户端。
  • Graphaello:一个使用 GraphQL 和 Apollo 在 SwiftUI 中编写声明式、类型安全和数据驱动的应用程序的工具

Python#

  • GQL:一个 Python 中的 GraphQL 客户端。
  • python-graphql-client:适用于 Python 2.7+ 的简单 GraphQL 客户端。
  • sgqlc:一个简单的 Python GraphQL 客户端。支持为 GraphQL schema 中定义的类型生成代码。

R#

  • ghql:通用的 GraphQL R 客户端。

工具#

  • graphiql (npm):一个交互式的运行于浏览器中的 GraphQL IDE.
  • libgraphqlparser:一个 C++ 版 GraphQL 查询语言分析器,提供 C 和 C++ API。
  • Graphql Language Service:一个用于构建 IDE 的 GraphQL 语言服务(诊断、自动完成等)的接口。
  • quicktype (github):在 TypeScript、Swift、golang、C#、C++ 等语言中为 GraphQL 查询生成类型。
  • GraphQL Code Generator:GraphQL 代码生成器具有对自定义插件和模板(如 Typescript 前端和后端、React Hooks、解析器签名等)的灵活支持。
  • GraphQL Inspector:比较 schema,验证文档,查找重大更改,查找相似类型,schema 覆盖率等等。
  • GraphQL Config:为你所有的 GraphQL 工具应用同一份配置(支持大多数工具、编辑器和 IDE)。
  • GraphQL CLI:用于常见 GraphQL 开发工作流程的命令行工具。
  • GraphQL Scalars:自定义 GraphQL 标量类型的库,用于创建精确的、类型安全的 GraphQL schema。
  • GraphQL Tools:一组用于快速开发 GraphQL 工具的实用程序(schema 和文档加载,schema 合并等)。
  • SOFA:从你的 GraphQL API 生成 REST API。
  • GraphQL-ESLint:将 GraphQL AST 集成到 ESLint 核心中(作为解析器)。
  • GraphQL Modules:使你可以将后端实现分拆成小型、可重用、易于实现和易于测试的部分。
  • GraphQL Mesh:允许你使用 GraphQL 查询语言来访问不运行 GraphQL 的远程 API(也包括那些运行 GraphQL 的远程 API)中的数据。它可以作为其他服务的网关,也可以作为本地 GraphQL schema 运行,以聚合来自远程 API 的数据。
  • Graphql Calculator:基于指令和表达式实现的轻量级查询计算引擎,允许你基于指令和表达式对查询字段进行加工转换和编排控制。

服务#

  • Apollo Graph Manage:一个用于监视 GraphQL 后端的性能和使用的云服务。
  • GraphCMS:一个 BaaS(后端即服务),它为你配置了一个作为内容编辑工具来处理存储数据的 GraphQL 后端。
  • Prisma (github):一个 BaaS(后端即服务),它为你的应用程序提供了一个 GraphQL 后端,且具有用于管理数据库和存储数据的强大的 web ui。
  • Tipe (github):一个 SaaS(软件即服务)内容管理系统,允许你使用强大的编辑工具创建你的内容,并通过 GraphQL 或 REST API 从任何地方访问它。
  • AWS AppSync:完全托管的 GraphQL 服务,包含实时订阅、离线编程和同步、企业级安全特性以及细粒度的授权控制。
  • Elide:一个 Java 库,可以在任何关系数据库上将 JPA 注释的数据模型公开为 GraphQL 服务。
  • Hasura (github):Hasura 连接到你的数据库和微服务,并立即为你提供可用于生产的 GraphQL API。
  • FaunaDB:通过导入 gql schema 创建即时 GraphQL 后端。数据库将为你创建关系和索引,因此你无需编写任何数据库代码即可在几秒钟内查询。Serverless 定价可免费开始使用。
  • Back4App:Back4App 是一个后端即服务平台,可帮助你基于 GraphQL 构建和扩展现代应用程序。

更多内容#

  • awesome-graphql:一个神奇的社区,维护一系列库、资源等。