《Elixir × GraphQL系列①》〜轻松搭建GraphQL服务器〜
圣水 × 图灵通信系列
~ 百蘭酒設定 ~
此篇文章是「Elixir Advent Calendar 2022」第八天的文章。
我是YOSUKE,目前在东京但是来自福冈ex。
由于我之前已经写过Graphql的设置,所以这次我会简单地写出步骤。以简洁的方式进行说明。
这个系列我打算做成三部曲。
mix phx.new open_data_ql
mix phx.gen.context Community Place places name:string location:string lat:float lon:float scale:integer
执行
mix ecto.create
mix ecto.migrate
添加依赖关系
defp deps do
[
# 省略 #
{:absinthe, "~> 1.7"},
{:absinthe_plug, "~> 1.5"},
{:absinthe_phoenix, "~> 2.0"}
]
end
执行
mix deps.get
准备样本数据
alias OpenDataQl.Repo
alias OpenDataQl.Community.Place
%Place{
name: "test1",
location: "test1",
lat: 123.45,
lon: 67.89,
scale: 1
} |> Repo.insert!
%Place{
name: "test2",
location: "test2",
lat: 223.45,
lon: 67.89,
scale: 2
} |> Repo.insert!
%Place{
name: "test3",
location: "test3",
lat: 323.45,
lon: 67.89,
scale: 3
} |> Repo.insert!
创建模式
defmodule OpenDataQlWeb.Schema.Schema do
use Absinthe.Schema
object :place do
field :id, non_null(:id)
field :name, non_null(:string)
field :location, non_null(:string)
field :lat, non_null(:float)
field :lon, non_null(:float)
field :scale, non_null(:integer)
end
query do
@desc "Get a list of places"
field :places, list_of(:place) do
resolve &OpenDataQlWeb.Resolvers.Community.places/3
end
@desc "Get a place by its id"
field :place, :place do
arg :id, non_null(:id)
resolve &OpenDataQlWeb.Resolvers.Community.place/3
end
end
end
创建解析器
defmodule OpenDataQlWeb.Resolvers.Community do
alias OpenDataQl.Community
def places(_, _, _) do
{:ok, Community.list_places()}
end
def place(_, %{id: id}, _) do
{:ok, Community.get_place!(id)}
end
end
在路由器上做追加记录
defmodule OpenDataQlWeb.Router do
use OpenDataQlWeb, :router
# 省略 #
pipeline :api do
plug :accepts, ["json"]
end
scope "/api" do
pipe_through :api
forward "/", Absinthe.Plug,
schema: OpenDataQlWeb.Schema.Schema
end
# 省略 #
if Mix.env() == :dev do
forward "/graphiql", Absinthe.Plug.GraphiQL,
schema: OpenDataQlWeb.Schema.Schema,
interface: :simple
end
end
开动
iex -S mix phx.server
访问
http://localhost:4000/图形界面查询语言
好了,既然到这一步完成了,下一步我们就用Elixir来制作客户端吧。