كيفية إنشاء واجهة برمجة تطبيقات CRUD مع Gin و MongoDB من Golang

كيفية إنشاء واجهة برمجة تطبيقات CRUD مع Gin و MongoDB من Golang

تعد Golang واحدة من لغات البرمجة الأعلى ربحًا والتي يوجد بها العديد من التطبيقات. عند الاقتران بأطر مثل Gin و Revel و gorilla / mux ، يمكنك بسهولة إنشاء واجهة برمجة تطبيقات باستخدام Go.



تعرف على كيفية إنشاء واجهة برمجة تطبيقات CRUD في Golang باستخدام إطار عمل Gin HTTP.





اجعل فيديو اليوم

الإعداد الأولي والتثبيت

ابدأ مع Golang عن طريق تثبيته على جهاز الكمبيوتر الخاص بك إذا لم تكن قد قمت بذلك بالفعل.





بمجرد التثبيت ، فإن الخطوة التالية هي إنشاء مجلد جذر للمشروع على جهازك وتهيئة وحدة Go في هذا الدليل الجذر.

للقيام بذلك ، افتح CLI ، انتقل إلى المجلد الجذر لمشروعك وقم بتشغيل:



go mod init module_name 

سترى اسم الوحدة الخاصة بك (على سبيل المثال CRUD_API ) وإصداره عند فتح ملف go.mod ملف. ستأتي جميع الحزم المخصصة من هذه الوحدة الرئيسية. لذلك تأخذ أي حزمة مخصصة مستوردة الشكل:

import(package CRUD_API/package-directory-name)

بعد ذلك ، قم بتثبيت الحزم اللازمة لإنشاء واجهة برمجة تطبيقات CRUD. في هذه الحالة ، استخدم جين غونيك لتوجيه نقاط نهاية API:





كيفية إزالة الأسطر في Word
go get github.com/gin-gonic/gin 

الآن قم بتثبيت برنامج تشغيل MongoDB لتخزين البيانات:

go get go.mongodb.org/mongo-driver/mongo

كيفية الاتصال اذهب إلى MongoDB

كل ما تحتاجه هو MongoDB URI الخاص بك لربط Golang بقاعدة البيانات. عادةً ما يبدو هكذا إذا كنت تتصل بـ MongoDB Atlas محليًا:





Mongo_URL = "mongodb://127.0.0.1:27017"

الآن قم بإنشاء مجلد جديد في الدليل الجذر لمشروعك وقم بتسميته قواعد بيانات . قم بإنشاء ملف Go داخل هذا المجلد وقم بتسميته قاعدة البيانات .

هذه هي حزمة قاعدة البيانات الخاصة بك ، وتبدأ باستيراد المكتبات المطلوبة:

package database 

import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectDB() *mongo.Client {
Mongo_URL := "mongodb://127.0.0.1:27017"
client, err := mongo.NewClient(options.Client().ApplyURI(Mongo_URL))

if err != nil {
log.Fatal(err)
}

ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
err = client.Connect(ctx)
defer cancel()

if err != nil {
log.Fatal(err)
}

fmt.Println("Connected to mongoDB")
return client
}

من أفضل الممارسات إخفاء متغيرات البيئة مثل سلسلة اتصال قاعدة البيانات في ملف .env ملف باستخدام حزمة dotenv . هذا يجعل الكود الخاص بك أكثر قابلية للنقل ويكون مفيدًا عند استخدام ملف مثيل الكتلة السحابية MongoDB ، فمثلا.

ال ConnectDB تقوم الوظيفة بإنشاء اتصال وإرجاع كائن عميل MongoDB جديد.

إنشاء مجموعة قاعدة بيانات

يقوم MongoDB بتخزين البيانات في مجموعات ، والتي توفر واجهة لبيانات قاعدة البيانات الأساسية.

للتعامل مع وظيفة جلب المجموعة ، ابدأ بإنشاء مجلد جديد ، مجموعة ، في جذر مشروعك. الآن قم بإنشاء ملف Go جديد ، getCollection.go ، التي تحصل على المجموعة من قاعدة البيانات:

package getcollection 

import (
"go.mongodb.org/mongo-driver/mongo"
)

func GetCollection(client *mongo.Client, collectionName string) *mongo.Collection {
collection := client.Database("myGoappDB").Collection("Posts")
return collection
}

تحصل هذه الوظيفة على المجموعة من قاعدة بيانات MongoDB. اسم قاعدة البيانات ، في هذه الحالة ، هو myGoappDB ، مع المشاركات كمجموعتها.

قم بإنشاء نموذج قاعدة البيانات

قم بإنشاء مجلد جديد داخل الدليل الجذر الخاص بك وقم بتسميته نموذج . يعالج هذا المجلد نموذج قاعدة البيانات الخاصة بك.

قم بإنشاء ملف Go جديد داخل هذا المجلد وقم بتسميته model.go . نموذجك ، في هذه الحالة ، هو منشور مدونة بعنوانه:

package model 

import (
"go.mongodb.org/mongo-driver/bson/primitive"
)

type Post struct {
ID primitive.ObjectID
Title string
Article string
}

إنشاء واجهة برمجة تطبيقات CRUD مع Go

التالي هو إنشاء واجهة برمجة تطبيقات CRUD. للبدء بهذا القسم ، أنشئ مجلدًا جديدًا داخل الدليل الجذر لمشروعك للتعامل مع نقاط النهاية الخاصة بك. نسميها الطرق .

قم بإنشاء ملف Go منفصل في هذا المجلد لكل إجراء. على سبيل المثال ، يمكنك تسميتها create.go و read.go و update.go ، و delete.go . ستقوم بتصدير هذه المعالجات باسم الطرق حزمة.

كيفية إنشاء نقطة نهاية POST في Go

ابدأ بتحديد نقطة نهاية POST لكتابة البيانات في قاعدة البيانات.

داخل المسارات / create.go ، يضاف ما يلي:

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func CreatePost(c *gin.Context) {
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
post := new(model.Posts)
defer cancel()

if err := c.BindJSON(&post); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": err})
log.Fatal(err)
return
}

postPayload := model.Posts{
Id: primitive.NewObjectID(),
Title: post.Title,
Article: post.Article,
}

result, err := postCollection.InsertOne(ctx, postPayload)

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "Posted successfully", "Data": map[string]interface{}{"data": result}})
}

يبدأ هذا الرمز باستيراد الوحدات النمطية المخصصة للمشروع. ثم تقوم باستيراد حزم الجهات الخارجية بما في ذلك شرك و سائق MongoDB .

إضافي، postCollection يحمل مجموعة قاعدة البيانات. على وجه الخصوص ، c.BindJSON ('post') هو مثيل نموذج JSONified الذي يستدعي كل حقل نموذج باسم postPayload ؛ هذا يذهب إلى قاعدة البيانات.

كيفية إنشاء GET Endpoint

نقطة نهاية GET ، بتنسيق المسارات / read.go ، يقرأ مستندًا واحدًا من قاعدة البيانات عبر معرفها الفريد. يبدأ أيضًا باستيراد الحزم المخصصة وحزم الجهات الخارجية:

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func ReadOnePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")

postId := c.Param("postId")
var result model.Posts

defer cancel()

objId, _ := primitive.ObjectIDFromHex(postId)

err := postCollection.FindOne(ctx, bson.M{"id": objId}).Decode(&result)

res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "success!", "Data": res})
}

ال المشاركات المتغير هو إعلان المعلمة. يحصل على معرف كائن المستند كـ الهدف .

لكن، نتيجة هو مثيل لنموذج قاعدة البيانات ، والذي يحمل لاحقًا المستند المرتجع كـ الدقة .

كيفية إنشاء نقطة نهاية PUT

معالج PUT ، بتنسيق المسارات / update.go ، مشابه لمعالج POST. هذه المرة ، تقوم بتحديث منشور موجود من خلال معرف الكائن الفريد الخاص به:

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func UpdatePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")

postId := c.Param("postId")
var post model.Posts

defer cancel()

objId, _ := primitive.ObjectIDFromHex(postId)

if err := c.BindJSON(&post); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

edited := bson.M{"title": post.Title, "article": post.Article}

result, err := postCollection.UpdateOne(ctx, bson.M{"id": objId}, bson.M{"$set": edited})

res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

if result.MatchedCount < 1 {
c.JSON(http.StatusInternalServerError, gin.H{"message": "Data doesn't exist"})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "data updated successfully!", "Data": res})
}

تنسيق JSON لمثيل النموذج ( بريد ) يستدعي كل حقل نموذج من قاعدة البيانات. يستخدم المتغير الناتج MongoDB مجموعة $ المشغل لتحديث المستند المطلوب الذي تم استدعاؤه بواسطة معرف الكائن الخاص به.

ال result.MatchedCount الشرط يمنع تشغيل الكود إذا لم يكن هناك سجل في قاعدة البيانات أو إذا كان المعرف الذي تم تمريره غير صالح.

إنشاء نقطة نهاية الحذف

نقطة نهاية الحذف ، بتنسيق delete.go ، يزيل مستندًا استنادًا إلى معرف الكائن الذي تم تمريره كمعامل URL:

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func DeletePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
var DB = database.ConnectDB()
postId := c.Param("postId")

var postCollection = getcollection.GetCollection(DB, "Posts")
defer cancel()
objId, _ := primitive.ObjectIDFromHex(postId)
result, err := postCollection.DeleteOne(ctx, bson.M{"id": objId})
res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

if result.DeletedCount < 1 {
c.JSON(http.StatusInternalServerError, gin.H{"message": "No data to delete"})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "Article deleted successfully", "Data": res})
}

هذا الرمز يحذف السجل باستخدام حذف واحد وظيفة. كما أنه يستخدم ملف result.DeletedCount الخاصية لمنع تشغيل التعليمات البرمجية إذا كانت قاعدة البيانات فارغة أو كان معرف الكائن غير صالح.

قم بإنشاء ملف API Runner

أخيرًا ، قم بإنشاء ملف main.go داخل الدليل الجذر لمشروعك. يجب أن يبدو هيكل مشروعك النهائي كما يلي:

  هيكل مشروع Golang CRUD

يعالج هذا الملف تنفيذ الموجه لكل نقطة نهاية:

package main 

import (
routes "CRUD_API/routes"
"github.com/gin-gonic/gin"
)

func main() {
router := gin.Default()

router.POST("/", routes.CreatePost)

// called as localhost:3000/getOne/{id}
router.GET("getOne/:postId", routes.ReadOnePost)

// called as localhost:3000/update/{id}
router.PUT("/update/:postId", routes.UpdatePost)

// called as localhost:3000/delete/{id}
router.DELETE("/delete/:postId", routes.DeletePost)

router.Run("localhost: 3000")
}

هذا الملف هو الحزمة الرئيسية التي تقوم بتشغيل الملفات الأخرى. يبدأ باستيراد معالجات التوجيه. التالي هو جهاز التوجيه متغير ، أ شرك المثال الذي يستدعي إجراءات HTTP ويستدعي كل نقطة نهاية باسم وظيفتها من الطرق حزمة.

يعمل مشروع CRUD الخاص بك المضيف المحلي: 3000 . لتشغيل الخادم و اختبار واجهة برمجة تطبيقات CRUD ، قم بتشغيل الأمر التالي في الدليل الأساسي الخاص بك:

go run main.go

حول مشروع Golang CRUD الخاص بك إلى منتج قابل للاستخدام

لقد نجحت في إنشاء واجهة برمجة تطبيقات CRUD مع Go ؛ تهانينا! في حين أن هذا مشروع صغير ، فقد رأيت ما يلزم لتنفيذ طلبات HTTP العادية في Go.

يمكنك أن تصبح أكثر إبداعًا من خلال توسيع هذا إلى تطبيق عملي أكثر يقدم قيمة للمستخدمين. Go هي لغة برمجة مناسبة لمجموعة من حالات الاستخدام.