GraphQL على Go: دليل شامل للمكتبات والأدوات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

GraphQL على Go: نظرة شاملة على الأدوات والمكتبات



GraphQL هي لغة استعلام لواجهات API وبيئة تشغيل لتنفيذ هذه الاستعلامات مع بياناتك الحالية. في نظام Go (Golang) البيئي، توجد عدة مكتبات ناضجة تسمح بدمج GraphQL بسهولة في مشروعك. في هذه المقالة، سنستعرض الأدوات الرئيسية، وهندستها المعمارية، ومزاياها، ونقدم أمثلة عملية على الكود.



لماذا GraphQL مهم لمطور Go؟



تشتهر Go بأدائها العالي، وبساطتها، ودعمها الممتاز للتوازي (concurrency). من ناحية أخرى، يحل GraphQL مشكلة التحميل الزائد للبيانات (over-fetching) ونقص التحميل (under-fetching) المميزة لـ REST API. الجمع بين Go و GraphQL يمنحك:

  • سلامة الأنواع (Type safety) — التنميط الصارم في Go يتناسب تمامًا مع مخطط GraphQL.
  • أداء عالي — يتم تجميع Go إلى كود أصلي ويعمل بسرعة.
  • مرونة الاستعلامات — يقرر العميل بنفسه الحقول التي يحتاجها.


المكتبات الرئيسية لـ GraphQL بلغة Go



1. gqlgen (gqlgen.com)



gqlgen هي المكتبة الأكثر شيوعًا لإنشاء خوادم GraphQL بلغة Go. تعمل وفق مبدأ "المخطط أولاً" (schema-first). تقوم بتعريف المخطط في ملف .graphql، ويقوم gqlgen بتوليد كل الكود اللازم (الأنواع، المحللات (resolvers)، النماذج).



الميزات الرئيسية:

  • توليد تلقائي للكود من المخطط.
  • دعم الاشتراكات (Subscriptions) عبر WebSockets.
  • دعم مدمج للسياق (context.Context) لنقل البيانات الوصفية.
  • إمكانية تخصيص الملفات المُولَّدة.


مثال على الاستخدام:



// schema.graphqltype Query {    user(id: ID!): User!}

type User { id: ID! name: String! email: String!}


// بعد توليد الكود (go run github.com/99designs/gqlgen init)// سيبدو المحلل (resolver) الخاص بك كالتالي:

package graph

import ( "context" "your-project/graph/model")

func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) { // منطق جلب المستخدم من قاعدة البيانات return &model.User{ ID: id, Name: "John Doe", Email: "john@example.com", }, nil}


2. graphql-go (github.com/graphql-go/graphql)



هذه المكتبة هي نسخة من graphql-js بلغة Go. على عكس gqlgen، تستخدم نهج "الكود أولاً" (code-first). تقوم بتعريف الأنواع والمخطط مباشرة في كود Go، بدون ملف مخطط منفصل.



الميزات الرئيسية:

  • دعم كامل لمواصفات GraphQL (يونيو 2018).
  • مرونة — يمكنك بناء المخططات ديناميكيًا.
  • توثيق وأمثلة ممتازة.
  • دعم التنفيذ المتوازي للاستعلامات.


مثال على الاستخدام:



package main

import ( "encoding/json" "fmt" "net/http"

"github.com/graphql-go/graphql")

var userType = graphql.NewObject(graphql.ObjectConfig{ Name: "User", Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), }, "name": &graphql.Field{ Type: graphql.String, }, },})

var queryType = graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "user": &graphql.Field{ Type: userType, Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.NewNonNull(graphql.String), }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) {

توصيات