واجهة برمجة تطبيقات GraphQL مع Go: دليل تعليمي خطوة بخطوة للمبتدئين

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

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

ابدأ الدورة
```html

مقدمة إلى GraphQL وGo



GraphQL هي لغة استعلام لواجهات برمجة التطبيقات (API)، طورتها Facebook. على عكس REST، حيث يعيد كل نقطة نهاية (endpoint) بنية بيانات ثابتة، يسمح GraphQL للعميل بطلب الحقول التي يحتاجها فقط. هذا يقلل من عدد الطلبات وحجم البيانات المنقولة. Go (Golang) هو خيار ممتاز لبناء واجهات برمجة تطبيقات عالية الأداء بفضل سرعتها، والكتابة الثابتة (static typing)، والدعم المدمج للتوازي (concurrency).



في هذا البرنامج التعليمي، سنبني واجهة GraphQL API بسيطة بلغة Go لإدارة قائمة الكتب. ستتعلم كيفية إعداد الخادم، تعريف المخطط (schema)، كتابة المحللّات (resolvers)، وتنفيذ الاستعلامات (queries) والتحوّلات (mutations).



إعداد المشروع وتثبيت المكتبات



تهيئة وحدة Go



أنشئ دليلاً جديداً للمشروع وقم بتهيئة الوحدة:



mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorial


تثبيت مكتبة graphql-go



سنستخدم المكتبة الشهيرة graphql-go/graphql. قم بتثبيتها باستخدام الأمر:



go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handler


المكتبة الأولى توفر نواة GraphQL، والثانية توفر معالج HTTP للتكامل مع خادم الويب.



إنشاء هيكل البيانات ومخطط GraphQL



تعريف النوع Book



أنشئ ملف main.go وابدأ بتعريف هيكل بيانات الكتاب ونوع GraphQL المقابل:



package main

import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")

// Book — هيكل بيانات الكتابtype Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}

// تعريف نوع GraphQL للكتابvar bookType = graphql.NewObject( graphql.ObjectConfig{ Name: "Book", Fields: graphql.Fields{ "id": &graphql.Field{Type: graphql.String}, "title": &graphql.Field{Type: graphql.String}, "author": &graphql.Field{Type: graphql.String}, "year": &graphql.Field{Type: graphql.Int}, }, },)


إنشاء الاستعلام الجذري (Query)



سنضيف مخزناً في الذاكرة (in-memory) للكتب واستعلاماً جذرياً لجلب القائمة وكتاب واحد:



// محاكاة قاعدة بياناتvar books = []Book{    {ID: "1", Title: "الحرب والسلام", Author: "ليو تولستوي", Year: 1869},    {ID: "2", Title: "الجريمة والعقاب", Author: "فيودور دوستويفسكي", Year: 1866},    {ID: "3", Title: "السيد ومارغريتا", Author: "ميخائيل بولغاكوف", Year: 1967},}

// الاستعلام الجذريvar queryType = graphql.NewObject( graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "books": &graphql.Field{ Type: graphql.NewList(bookType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { return books, nil }, }, "book": &graphql.Field{ Type: bookType, Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{Type: graphql.String}, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, _ := p.Args["id"].(string) for _, book := range books { if book.ID == id { return book, nil } } return nil, nil }, }, }, },)


إضافة التحوّلات (Mutation)



التحوّلات تسمح بتعديل البيانات. سنضيف إمكانية إضافة كتب جديدة:



// تحوّل لإضافة كتابvar mutationType = graphql.NewObject(```                

المدونات

توصيات الكتب