Absinthe 允许您使用 Elixir 编写 GraphQL 服务器。
简介
概念
Schema- 根(Root)。定义了您可以执行哪些查询,以及这些查询返回什么类型的数据。Resolver- 返回数据的函数。Type- 类型定义,描述了所返回数据的结构(形态)。
Plug
web/router.ex
defmodule Blog.Web.Router do
use Phoenix.Router
forward "/", Absinthe.Plug,
schema: Blog.Schema
end
Absinthe 是一个 Plug,你需要向其传入一个参数 Schema(模式).
参见: 我们的第一个查询 (Query)
核心概念
Schema(模式)
web/schema.ex
defmodule Blog.Schema do
use Absinthe.Schema
import_types Blog.Schema.Types
query do
@desc "Get a list of blog posts"
field :posts, list_of(:post) do
resolve &Blog.PostResolver.all/2
end
end
end
此 Schema 将负责处理 { posts { ··· } }。它返回一个 类型 (Type) ,属于 :post,并将任务委托给 解析器 (Resolver).
解析器 (Resolver)
web/resolvers/post_resolver.ex
defmodule Blog.PostResolver do
def all(_args, _info) do
{:ok, Blog.Repo.all(Blog.Post)}
end
end
这是 Schema 将查询委托给的 posts 函数。
类型 (Type)
web/schema/types.ex
defmodule Blog.Schema.Types do
use Absinthe.Schema.Notation
@desc "A blog post"
object :post do
field :id, :id
field :title, :string
field :body, :string
end
end
这里定义了一个类型 :post,供解析器 (Resolver) 使用。
Schema(模式)
查询参数 (Query arguments)
GraphQL 查询
{ user(id: "1") { ··· } }
web/schema.ex
query do
field :user, type: :user do
arg :id, non_null(:id)
resolve &Blog.UserResolver.find/2
end
end
解析器 (Resolver)
def find(%{id: id} = args, _info) do
···
end
变更 (Mutations)
GraphQL 查询
{
mutation CreatePost {
post(title: "Hello") { id }
}
}
web/schema.ex
mutation do
@desc "Create a post"
field :post, type: :post do
arg :title, non_null(:string)
resolve &Blog.PostResolver.create/2
end
end
参见: 变更 (Mutations)
参考资料
- Absinthe 网站 (absinthe-graphql.org)
- GraphQL 速查表 (Cheatsheet)