좋아하는 기능 언어로 GraphQL API를 구축하십시오!
Morpheus GraphQL (Server & Client)을 사용하면 기본 Haskell 유형의 Haskell에서 GraphQL API를 구축 할 수 있습니다. Morpheus는 Haskell 유형을 GraphQL 스키마로 변환하며 모든 Resolver는 기본 Haskell 기능입니다. Morpheus GraphQL은 GraphQL 스키마 또는 쿼리를 Haskell 유형으로 변환하여 컴파일 타임에 검증 할 수 있습니다.
Morpheus는 여전히 개발의 초기 단계에 있으므로 모든 피드백이 환영받는 것 이상의 것이므로 모든 공헌에 감사드립니다! GitHub에서 문제를 열거 나 Slack 채널에 가입하여 연락을 취하십시오.
이 readme 파일은 라이브러리에 대한 간단한 소개 만 제공합니다. 보다 고급 주제에 관심이 있으시면 문서를 방문하십시오.
버전 v0.28.0이므로 Morpheus GraphQL은 [ https://github.com/enisdenjo/graphql-ws/blob/mas https://github.com/apollographql/subscriptions-transport-ws/blob/master/protocol.md 프로토콜.
Morpheus를 시작하려면 먼저 다음과 같이 프로젝트 의존성에 추가해야합니다 (HPACK을 사용한다고 가정).
package.yml
dependencies :
- morpheus-graphql
- morpheus-graphql-core
- morpheus-graphql-subscriptions또한 선택할 버전을 스택에 알려야합니다.
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 사용하십시오
Morpheus로 GraphQL API를 정의하기 위해 API 스키마를 기본 Haskell 데이터 유형으로 정의하여 Generic 유형 클래스를 도출합니다. DeriveAnyClass 언어 확장을 사용하여 GQLType 유형 클래스에 대한 인스턴스도 파생됩니다. 이 Query 유형의 게으르게 해결 가능한 필드는 a -> ResolverQ () IO b 통해 정의되며, 인수 세트를 구체적인 a 을 해결하는 것을 나타냅니다. b .
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 유형의 각 필드에 대해 일부 데이터 소스 (예 : 데이터베이스 또는 다른 API)를 참조하여 런타임 중 값을 제공하는 Resolver 구현을 정의합니다. 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 요청 파서는 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 정의하고 Morpheus 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는 ByteString -> IO ByteString 으로 정의되어 scotty 또는 serverless-haskell 과 같은 임의의 웹 프레임 워크 내에서 직접 호출하거나 사용할 수 있습니다. 이 예에서는 scotty 로 갈 것입니다.
main :: IO ()
main = scotty 3000 $ post " /api " $ raw =<< (liftIO . gqlApi =<< body) 이제 Insomnia 같은 도구에서 예를 들어 그래프 QL 쿼리가있는 http://localhost:3000/api 에 게시물 요청을 보내면 :
query GetDeity {
deity ( name : " Morpheus " ) {
fullName
power
}
}우리의 질문이 해결됩니다!
{
"data" : {
"deity" : {
"fullName" : " Morpheus " ,
"power" : " Shapeshifting "
}
}
} Serverless 로 Morpheus GraphQL API를 작성하는 데 관심이 있다면이 저장소의 예제를 살펴 봐야 GraphiQL . 신화 API 는 Morpheus GraphQL 및 Serverless-Haskell 사용한 예제 프로젝트 빌드입니다.
Mythology API는 다음에 배포되었습니다 : API.MorpheusGraphQL.com 에서 GraphiQL 로 테스트 할 수 있습니다.
다음은 Morpheus GraphQL을 사용하는 프로젝트 목록입니다. Morpheus GraphQL 사용을 시작하려면 시작하기에 좋은 템플릿입니다.
프로젝트를 공유하려면이 섹션을 편집하고 PR을 보내십시오 .
Morpheus 는 그리스어와 꿈의 그리스 신으로, 그리스어 단어 μορφή 에서 형태 나 모양을 의미하는 꿈입니다. 그는 다양한 형태를 모방 할 수 있다고합니다. GraphQL은 정확히 그 일을 잘합니다 : 많은 다른 API의 형태로 데이터 변환.
Morpheus는 Nalchevanidze 가 작성하고 유지합니다