بناء واجهات برمجة التطبيقات GraphQL مع لغتك الوظيفية المفضلة!
يساعدك Morpheus GraphQL (Server & Client) على إنشاء واجهات برمجة تطبيقات GraphQL في Haskell مع أنواع Haskell الأصلية. ستقوم Morpheus بتحويل أنواع Haskell الخاصة بك إلى مخطط GraphQL وجميع محدداتك هي مجرد وظائف Haskell الأصلية. يمكن لـ Morpheus GraphQL أيضًا تحويل مخطط GraphQL الخاص بك أو الاستعلام إلى أنواع Haskell والتحقق منها في وقت الترجمة.
لا يزال Morpheus في مرحلة مبكرة من التطوير ، لذلك أي ردود فعل أكثر من موضع ترحيب ، ونحن نقدر أي مساهمة! ما عليك سوى فتح مشكلة هنا على Github ، أو انضم إلى قناة Slack الخاصة بنا للاتصال.
يرجى ملاحظة أن ملف ReadMe هذا يوفر فقط مقدمة موجزة للمكتبة. إذا كنت مهتمًا بموضوعات أكثر تقدماً ، تفضل بزيارة Docs.
منذ الإصدار v0.28.0 ، ينفذ Morpheus GraphQl The [ https://github.com/enisdenjo/graphql-ws/blob/master/protocol.md charevbricy chrapeql-Ns https://github.com/apollographql/subscriptions-transport-ws/blob/master/protocol.md بروتوكول.
للبدء في Morpheus ، تحتاج أولاً إلى إضافته إلى تبعيات مشروعك ، على النحو التالي (على افتراض أنك تستخدم HPACK):
حزمة
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 بإنشاء أنواع ذات حقول مسجلة. إذا كنت لا تحتاج إلى مساحة اسم ، فاستخدم importGQLDocument
لتحديد واجهة برمجة تطبيقات GraphQL مع morpheus ، نبدأ بتحديد مخطط 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 ) ، سنقوم بتحديد تطبيق 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 طلب كل من الهويات المحجوزة في 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 كما ترون ، يتم تعريف واجهة برمجة التطبيقات على أنها 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 مع Serverless ، فيجب أن تلقِ نظرة على مثالنا في هذا المستودع: API الأساطير هو مثالنا على بناء مشروع مع Morpheus GraphQL و Serverless-Haskell ، حيث يمكنك الاستعلام عن شخصيات مختلفة الأساطير مع GraphiQL .
تم نشر API للأساطير على: api.morpheusgraphql.com حيث يمكنك اختباره باستخدام GraphiQL
فيما يلي قائمة المشاريع باستخدام Morpheus GraphQL. إذا كنت ترغب في البدء في استخدام Morpheus GraphQL ، فهي قوالب جيدة لتبدأ.
قم بتحرير هذا القسم وأرسل العلاقات العامة إذا كنت ترغب في مشاركة مشروعك .
Morpheus هو إله النوم اليوناني والأحلام الذي يأتي اسمه من الكلمة اليونانية - يعني الشكل أو الشكل. ويقال إنه قادر على تقليد أشكال مختلفة و GraphQL جيد في القيام بذلك بالضبط: تحويل البيانات في شكل العديد من واجهات برمجة التطبيقات المختلفة.
Morpheus مكتوب وصيانته من قبل Nalchevanidze