สร้าง graphql apis ด้วยภาษาที่คุณชื่นชอบ!
Morpheus GraphQl (เซิร์ฟเวอร์และไคลเอนต์) ช่วยให้คุณสร้าง graphql apis ใน Haskell ด้วยประเภท Haskell ดั้งเดิม Morpheus จะแปลงประเภท Haskell ของคุณเป็น schema graphQL และตัวแก้ไขทั้งหมดของคุณเป็นเพียงฟังก์ชั่น Haskell ดั้งเดิม Morpheus graphQl ยังสามารถแปลง schema graphql หรือการสืบค้นของคุณเป็นประเภท haskell และตรวจสอบพวกเขาในเวลารวบรวม
Morpheus ยังคงอยู่ในช่วงเริ่มต้นของการพัฒนาดังนั้นข้อเสนอแนะใด ๆ ก็เป็นมากกว่าการต้อนรับและเราขอขอบคุณการสนับสนุนใด ๆ ! เพียงเปิดปัญหาที่นี่ใน GitHub หรือเข้าร่วมช่อง Slack ของเราเพื่อติดต่อ
โปรดทราบว่าไฟล์ readme นี้มีเพียงการแนะนำสั้น ๆ เกี่ยวกับไลบรารี หากคุณสนใจในหัวข้อขั้นสูงให้ไปที่เอกสาร
ตั้งแต่เวอร์ชัน v0.28.0, Morpheus graphql ใช้ [https://github.com/enisdenjo/graphql-ws/blob/master/protocol.md เดียวกัน 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 สร้างประเภท: Query Deity DeityArgs ที่สามารถใช้งานได้โดย rootResolver
descriptions และ deprecations จะแสดงในวิปัสสนา
importGQLDocumentWithNamespace จะสร้างประเภทด้วยฟิลด์ namespaced หากคุณไม่ต้องการเนมสเปซให้ใช้ importGQLDocument
ในการกำหนด graphql api กับ morpheus เราเริ่มต้นด้วยการกำหนด Schema 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 ) สำหรับแต่ละฟิลด์ในประเภท Query ที่กำหนดผ่าน a -> mb (เช่น deity ) เราจะกำหนดการใช้งานตัวแก้ไขที่ให้ค่าระหว่างการรันไทม์โดยอ้างถึงแหล่งข้อมูลบางแห่งเช่นฐานข้อมูลหรือ API อื่น ฟิลด์ที่กำหนดโดยไม่มี 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 ขอตัวแยกวิเคราะห์แปลงตัวตนที่สงวนไว้แต่ละตัวใน 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 Morpheus 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) หากตอนนี้เราส่งคำขอโพสต์ไปที่ http://localhost:3000/api พร้อมด้วยการสืบค้น GraphQL เป็นตัวตัวอย่างเช่นในเครื่องมือเช่น Insomnia :
query GetDeity {
deity ( name : " Morpheus " ) {
fullName
power
}
}คำถามของเราจะได้รับการแก้ไข!
{
"data" : {
"deity" : {
"fullName" : " Morpheus " ,
"power" : " Shapeshifting "
}
}
} หากคุณสนใจที่จะสร้าง Morpheus GraphQL API ด้วย Serverless คุณควรดูตัวอย่างของเราในที่เก็บ GraphiQL : Mythology API มันเป็นตัวอย่างของโครงการของเราที่สร้างด้วย Morpheus GraphQL และ Serverless-Haskell
Mythology API ถูกนำไปใช้กับ: api.morpheusgraphql.com ซึ่งคุณสามารถทดสอบได้ด้วย GraphiQL
ด้านล่างนี้เป็นรายการของโครงการที่ใช้ Morpheus GraphQl หากคุณต้องการเริ่มใช้ Morpheus GraphQL พวกเขาเป็นเทมเพลตที่ดีที่จะเริ่มต้นด้วย
แก้ไขส่วนนี้และส่ง PR หากคุณต้องการแบ่งปันโครงการของคุณ
Morpheus เป็นเทพเจ้ากรีกแห่งการนอนหลับและความฝันที่มีชื่อมาจากคำภาษากรีก μορφή ความหมายหรือรูปร่าง เขาได้รับการกล่าวขานว่าสามารถเลียนแบบรูปแบบที่แตกต่างกันและ GraphQL นั้นทำได้ดีอย่างแน่นอน: การแปลงข้อมูลในรูปของ API ที่แตกต่างกันมากมาย
Morpheus เขียนและดูแลโดย Nalchevanidze