知海

Haskell:mu-haskell(GraphQL 服务端)

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

Haskell:mu-haskell(GraphQL 服务端)

所属分类:生态项目与库

简介

Mu-Haskell 是一个用于构建微服务(gRPC、HTTP)和 GraphQL API 的 Haskell 库。它允许在类型层面表示 GraphQL schema,并且这些类型级表示能够从 schema 文件自动生成。

项目主页:https://higherkindness.io/mu-haskell/
GitHub 仓库:https://github.com/higherkindness/mu-haskell

示例

以下是一个 GraphQL 服务端的示例实现,其中 schema 的类型级表示是自动生成的:

haskell 复制代码
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

-- imports omitted for brevity...

graphql "Library" "library.graphql" -- all the magic happens here! 🪄🎩

-- ... a bit more code...

libraryServer :: SqlBackend -> ServerT ObjectMapping i Library ServerErrorIO _
libraryServer conn =
  resolver
    ( object @"Book"
        ( field @"id" bookId,
          field @"title" bookTitle,
          field @"author" bookAuthor,
          field @"imageUrl" bookImage
        ),
      object @"Author"
        ( field @"id" authorId,
          field @"name" authorName,
          field @"books" authorBooks
        ),
      object @"Query"
        ( method @"authors" allAuthors,
          method @"books" allBooks
        ),
      object @"Mutation"
        ( method @"newAuthor" newAuthor,
          method @"newBook" newBook
        ),
      object @"Subscription"
        (method @"allBooks" allBooksConduit)
    )
  where
    bookId :: Entity Book -> ServerErrorIO Integer
    bookId (Entity (BookKey k) _) = pure $ toInteger k
    -- ... more resolvers...

代码中的 graphql 宏负责从 library.graphql 文件自动生成类型级 schema 表示,使服务端能够以类型安全的方式实现 resolver。随后通过 resolverobjectfieldmethod 等组合子定义对象类型(如 BookAuthor)以及操作(查询、变更、订阅)。

相关链接

  • 关于如何构建自己的 GraphQL 服务端,请参阅官方文档
  • 更完整的端到端示例(包含使用 Elm 编写的客户端),请参阅示例仓库

帮助我们改进文档

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