知海

Haskell:Morpheus GraphQL(服务端实现)

graphql-github-io-zh-Hans生态项目与库

Haskell:Morpheus GraphQL(服务端实现)

Morpheus GraphQL 是一个用于构建 GraphQL API 的 Haskell 库。它利用 Haskell 强大的类型系统,提供了声明式、类型安全的 GraphQL 服务端开发体验。以下是一个使用 morpheus-graphql 的 Hello World 示例。

定义 Schema

首先,我们通过一个 GraphQL SDL 文件定义类型和查询入口:

graphql 复制代码
# 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!
}

这里定义了一个 Deity 类型,包含 name(非空字符串)和 power(可空字符串,并标记为已弃用)。Query 类型提供了一个 deity 查询字段,接受一个默认为 "Morpheus" 的字符串参数,返回一个非空的 Deity 对象。

实现 Resolver

接下来,在 Haskell 代码中导入 GraphQL 文档并实现对应的解析器:

haskell 复制代码
{-# 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

代码说明:

  • importGQLDocument "schema.gql" 会在编译时解析 Schema 文件,并自动生成对应的 Haskell 类型(如 QueryDeity 及其参数类型)。
  • rootResolver 是根解析器,实现了 Query 中的 deity 字段。该函数接收 DeityArgs(包含 name 参数),返回一个 Deity 值,其中 name 直接使用传入参数,power 返回一个固定的值 "Shapeshifting"
  • api 函数将 rootResolver 交由 interpreter 处理,得到一个接收 ByteString 请求并返回 ByteString 响应的函数,可直接用于 Web 框架中。

更多示例

如需了解更多复杂的 API 示例,请参阅官方仓库:morpheus-graphql-examples

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。