お気に入りの機能言語でGraphQL APIを構築してください!
Morpheus GraphQL(サーバー&クライアント)は、ネイティブHaskellタイプを使用してHaskellでGraphQL APIを構築するのに役立ちます。 MorpheusはHaskellタイプをGraphQLスキーマに変換し、すべてのリゾルバーはネイティブハスケル関数にすぎません。 Morpheus GraphQLは、GraphQLスキーマまたはクエリをHaskellタイプに変換し、コンパイル時間で検証することもできます。
モルフェウスはまだ開発の初期段階にあるので、どんなフィードバックも大歓迎であり、貢献に感謝します! GitHubでここで問題を開くか、Slackチャンネルに参加して連絡を取ります。
このreadmeファイルは、ライブラリの簡単な紹介のみを提供していることに注意してください。より高度なトピックに興味がある場合は、Docsにアクセスしてください。
バージョンv0.28.0以来、Morpheus graphqlは[https://github.com/enisdenjo/graphql-ws/blob/master/protocol.md [graphql-ws graphql over websocketプロトコル)を実装し、もはや使用しなくなり、 https://github.com/apollographql/subscriptions-transport-ws/blob/master/protocol.md Protocol。
モルフェウスを始めるには、最初に次のようにプロジェクトの依存関係に追加する必要があります(HPACKを使用していると仮定します):
package.yml
dependencies :
- morpheus-graphql
- morpheus-graphql-core
- morpheus-graphql-subscriptionsさらに、選択するバージョンをStackに伝える必要があります。
stack.yml
resolver : lts-16.2
extra-deps :
- morpheus-graphql-0.28.0
- morpheus-graphql-core-0.28.0
- morpheus-graphql-app-0.28.0
- morpheus-graphql-code-gen-0.28.0
- morpheus-graphql-code-gen-utils-0.28.0
- morpheus-graphql-server-0.28.0
- morpheus-graphql-client-0.28.0
- morpheus-graphql-subscriptions-0.28.0schema.gql
type Query {
deity ( name : String ! = " Morpheus " ): Deity !
}
"""
Description for Deity
"""
type Deity {
"""
Description for name
"""
name : String !
power : String @deprecated ( reason : " some reason for " )
}API.HS
{-# 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テンプレートのhaskellは、 rootResolverが使用できるQuery 、 Deity 、 DeityArgs生成するタイプを生成します
descriptionsとdeprecations内省で表示されます。
importGQLDocumentWithNamespace 、名前のあるフィールドでタイプを生成します。名前空間が必要ない場合は、 importGQLDocument使用します
GraphQL APIをMorpheusで定義するには、APIスキーマをネイティブHaskellデータ型として定義することから始めます。これは、 Generic型クラスを導き出します。 DeriveAnyClass Language拡張機能を使用して、 GQLTypeタイプクラスのインスタンスも導出します。このQueryタイプのゆっくりと解決可能なフィールドは、 a -> ResolverQ () IO bを介して定義bれますa
data Query m = Query
{ deity :: DeityArgs -> m Deity
} deriving ( Generic , GQLType )
data Deity = Deity
{ fullName :: Text -- Non-Nullable Field
, power :: Maybe Text -- Nullable Field
} deriving ( Generic , GQLType )
data DeityArgs = DeityArgs
{ name :: Text -- Required Argument
, mythology :: Maybe Text -- Optional Argument
} deriving ( Generic , GQLType ) a -> mb ( deityなど)を介して定義されたQueryタイプの各フィールドについて、データベースなどのデータソースを参照することにより、実行時に値を提供するリゾルバー実装を定義します。 a -> mbなしで定義されているフィールドは、値を提供するだけです。
上記の例では、 DeityArgsのフィールドは、競合を回避するために、予約されたアイデンティティ( type 、 whereなど)を使用して名前が付けられている可能'があります。たとえば、次のようにすることができます。
data DeityArgs = DeityArgs
{ name :: Text -- Required Argument
, mythology :: Maybe Text -- Optional Argument
, type' :: Text
} deriving ( Generic , GQLType )最終リクエストのフィールド名は、 type'の代わりにtypeなります。 Morpheus Request Parserは、Haskell 2010の予約された各アイデンティティを内部的に対応する名前に変換します。これは選択にも適用されます。
resolveDeity :: DeityArgs -> ResolverQ () IO Deity
resolveDeity DeityArgs { name, mythology } = liftEither $ dbDeity name mythology
askDB :: Text -> Maybe Text -> IO ( Either String Deity )
askDB = ...このQueryタイプをAPIとして使用できるようにするために、 RootResolverを定義し、モルフェウスのinterpreterに送ります。 RootResolver query 、 mutation 、 subscription定義で構成されていますが、この例では後者を省略します。
rootResolver :: RootResolver IO () Query Undefined Undefined
rootResolver =
RootResolver
{ queryResolver = Query {deity = resolveDeity}
, mutationResolver = Undefined
, subscriptionResolver = Undefined
}
gqlApi :: ByteString -> IO ByteString
gqlApi = interpreter rootResolverご覧のとおり、APIは、直接呼び出すか、 scottyやserverless-haskellなどの任意のWebフレームワーク内で使用できるByteString -> IO ByteStringとして定義されます。この例ではscottyに行きます。
main :: IO ()
main = scotty 3000 $ post " /api " $ raw =<< (liftIO . gqlApi =<< body)現在、 http://localhost:3000/apiにhttp:// localhostに投稿リクエストを送信した場合、たとえばInsomniaのようなツールでボディとしてgraphqlクエリを使用して:
query GetDeity {
deity ( name : " Morpheus " ) {
fullName
power
}
}私たちのクエリは解決されます!
{
"data" : {
"deity" : {
"fullName" : " Morpheus " ,
"power" : " Shapeshifting "
}
}
}ServerlessでMorpheus GraphQL APIを作成することに興味がある場合は、このリポジトリの例をご覧ください: Mythology API Morpheus GraphQLとServerless-Haskell GraphiQL使用したプロジェクトビルドの例です。
Mythology APIは展開されています: api.morpheusgraphql.com GraphiQLでテストできる
以下は、Morpheus GraphQLを使用したプロジェクトのリストです。 Morpheus GraphQLの使用を開始したい場合は、最初から優れたテンプレートです。
このセクションを編集し、プロジェクトを共有したい場合はPRを送信します。
モルフェウスはギリシャの睡眠と夢の神であり、その名前はギリシャ語の単語μρφήformまたは形状から来ています。彼は異なる形式を模倣できると言われており、GraphQLはそれを正確に行うのが得意です。多くの異なるAPIの形でデータを変換します。
モルフェウスは、ナルチェバニッツェによって書かれ、維持されています