گولانگ کے جن اور مونگو ڈی بی کے ساتھ ایک CRUD API کیسے بنایا جائے۔

گولانگ کے جن اور مونگو ڈی بی کے ساتھ ایک CRUD API کیسے بنایا جائے۔

گولانگ بہت ساری ایپلی کیشنز کے ساتھ سب سے زیادہ ادائیگی کرنے والی، ان ڈیمانڈ پروگرامنگ زبانوں میں سے ایک ہے۔ Gin، Revel، اور gorilla/mux جیسے فریم ورک کے ساتھ جوڑا بنانے پر، آپ Go کے ساتھ آسانی سے ایک API بنا سکتے ہیں۔





Gin HTTP فریم ورک کا استعمال کرتے ہوئے Golang میں CRUD API بنانے کا طریقہ سیکھیں۔





وہ جگہیں جو آئی فونز کو سستے میں ٹھیک کرتی ہیں۔
دن کی ویڈیو کا میک یوز

ابتدائی سیٹ اپ اور انسٹالیشن

گولانگ کے ساتھ شروع کریں۔ اگر آپ نے پہلے سے ایسا نہیں کیا ہے تو اسے اپنے کمپیوٹر پر انسٹال کرکے۔





ایک بار انسٹال ہونے کے بعد، اگلا مرحلہ اپنی مشین پر پروجیکٹ روٹ فولڈر بنانا ہے اور اس روٹ ڈائرکٹری میں گو ماڈیول شروع کرنا ہے۔

ایسا کرنے کے لئے، کھولیں ایک CLI ، اپنے پروجیکٹ روٹ فولڈر پر جائیں اور چلائیں:



go mod init module_name 

آپ اپنے ماڈیول کا نام دیکھیں گے (جیسے CRUD_API ) اور اس کا ورژن جب آپ کھولتے ہیں۔ go.mod فائل تمام حسب ضرورت پیکجز اس پیرنٹ ماڈیول سے آئیں گے۔ لہذا کوئی بھی درآمد شدہ کسٹم پیکیج فارم لیتا ہے:

import(package CRUD_API/package-directory-name)

اگلا، CRUD API بنانے کے لیے ضروری پیکیجز انسٹال کریں۔ اس صورت میں، استعمال کریں جن گونک API کے اختتامی مقامات کو روٹ کرنے کے لیے:





go get github.com/gin-gonic/gin 

اب ڈیٹا اسٹور کرنے کے لیے MongoDB ڈرائیور انسٹال کریں:

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

جڑنے کا طریقہ MongoDB پر جائیں۔

گولانگ کو ڈیٹا بیس سے مربوط کرنے کے لیے آپ کو بس اپنے MongoDB URI کی ضرورت ہے۔ اگر آپ مقامی طور پر MongoDB Atlas سے جڑ رہے ہیں تو یہ عام طور پر ایسا لگتا ہے:





Mongo_URL = "mongodb://127.0.0.1:27017"

اب اپنی پروجیکٹ روٹ ڈائرکٹری میں ایک نیا فولڈر بنائیں اور اسے کال کریں۔ ڈیٹا بیس . اس فولڈر کے اندر ایک گو فائل بنائیں اور اسے نام دیں۔ database.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
}

ماحولیاتی متغیرات کو چھپانا بہترین عمل ہے جیسے ڈیٹا بیس کنکشن سٹرنگ a میں env فائل dotenv پیکیج کا استعمال کرتے ہوئے . یہ آپ کے کوڈ کو زیادہ پورٹیبل بناتا ہے اور استعمال کرتے وقت کام آتا ہے۔ مونگو ڈی بی کلاؤڈ کلسٹر مثال ، مثال کے طور پر.

دی کنیکٹ ڈی بی فنکشن ایک کنکشن قائم کرتا ہے اور ایک نیا MongoDB کلائنٹ آبجیکٹ واپس کرتا ہے۔

ڈیٹا بیس کا مجموعہ بنائیں

MongoDB ڈیٹا کو کلیکشنز میں اسٹور کرتا ہے، جو کہ بنیادی ڈیٹا بیس ڈیٹا کو انٹرفیس فراہم کرتا ہے۔

جمع کرنے کی فعالیت کو سنبھالنے کے لیے، ایک نیا فولڈر بنا کر شروع کریں، مجموعہ ، آپ کے پروجیکٹ کی جڑ میں۔ اب ایک نئی گو فائل بنائیں، 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 کے ساتھ پوسٹس اس کے مجموعہ کے طور پر.

ڈیٹا بیس ماڈل بنائیں

اپنی روٹ ڈائرکٹری کے اندر ایک نیا فولڈر بنائیں اور اسے کال کریں۔ ماڈل . یہ فولڈر آپ کے ڈیٹا بیس ماڈل کو ہینڈل کرتا ہے۔

اس فولڈر کے اندر ایک نئی گو فائل بنائیں اور اسے کال کریں۔ model.go . آپ کا ماڈل، اس معاملے میں، اس کے عنوان کے ساتھ ایک بلاگ پوسٹ ہے:

package model 

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

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

Go کے ساتھ ایک CRUD API بنانا

اگلا CRUD API تخلیق ہے۔ اس سیکشن کے ساتھ شروع کرنے کے لیے، اپنے پراجیکٹ روٹ ڈائرکٹری کے اندر ایک نیا فولڈر بنائیں تاکہ اپنے اختتامی نکات کو سنبھال سکیں۔ اسے بلاؤ راستے .

ہر ایکشن کے لیے اس فولڈر میں ایک الگ گو فائل بنائیں۔ مثال کے طور پر، آپ ان کا نام لے سکتے ہیں۔ create.go , read.go , update.go ، اور delete.go . آپ ان ہینڈلرز کو بطور ایکسپورٹ کریں گے۔ راستے پیکج

گو میں پوسٹ اینڈ پوائنٹ کیسے بنائیں

ڈیٹا بیس میں ڈیٹا لکھنے کے لیے POST اینڈ پوائنٹ کی وضاحت کرکے شروع کریں۔

اندر routes/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}})
}

یہ کوڈ پروجیکٹ کے کسٹم ماڈیولز درآمد کرکے شروع ہوتا ہے۔ اس کے بعد یہ تھرڈ پارٹی پیکج سمیت درآمد کرتا ہے۔ جن اور مونگو ڈی بی ڈرائیور .

مزید، پوسٹ کلیکشن ڈیٹا بیس کا مجموعہ رکھتا ہے۔ خاص طور پر، c.BindJSON('پوسٹ') ایک JSONified ماڈل مثال ہے جو ہر ماڈل فیلڈ کو کال کرتی ہے۔ پوسٹ پے لوڈ ; یہ ڈیٹا بیس میں جاتا ہے۔

GET اینڈ پوائنٹ کیسے بنایا جائے۔

GET اختتامی نقطہ، میں routes/read.go ، ڈیٹا بیس سے ایک واحد دستاویز کو اپنی منفرد ID کے ذریعے پڑھتا ہے۔ یہ کسٹم اور تھرڈ پارٹی پیکجز کو درآمد کرکے بھی شروع ہوتا ہے:

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})
}

دی پوسٹس متغیر ایک پیرامیٹر کا اعلان ہے۔ یہ ایک دستاویز کی آبجیکٹ ID کے طور پر حاصل کرتا ہے۔ اعتراض .

البتہ، نتیجہ ڈیٹا بیس ماڈل کی ایک مثال ہے، جو بعد میں واپس کی گئی دستاویز کو رکھتا ہے۔ res .

PUT اینڈ پوائنٹ کیسے بنایا جائے۔

PUT ہینڈلر، میں routes/update.go ، POST ہینڈلر کی طرح ہے۔ اس بار، یہ ایک موجودہ پوسٹ کو اپنی منفرد آبجیکٹ ID کے ذریعے اپ ڈیٹ کرتا ہے:

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 فارمیٹ ( پوسٹ ) ڈیٹا بیس سے ہر ماڈل فیلڈ کو کال کرتا ہے۔ نتیجہ متغیر مونگو ڈی بی کا استعمال کرتا ہے۔ $سیٹ آپریٹر ایک مطلوبہ دستاویز کو اپ ڈیٹ کرنے کے لیے جسے اس کی آبجیکٹ ID کے ذریعے بلایا جاتا ہے۔

دی نتیجہ۔MatchedCount شرط کوڈ کو چلنے سے روکتا ہے اگر ڈیٹا بیس میں کوئی ریکارڈ نہیں ہے یا پاس کردہ ID غلط ہے۔

ڈیلیٹ اینڈ پوائنٹ بنانا

ڈیلیٹ اینڈ پوائنٹ، میں delete.go ، یو آر ایل پیرامیٹر کے بطور پاس کردہ آبجیکٹ ID پر مبنی دستاویز کو ہٹاتا ہے:

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})
}

یہ کوڈ کا استعمال کرتے ہوئے ایک ریکارڈ کو حذف کرتا ہے۔ DeleteOne فنکشن یہ بھی استعمال کرتا ہے۔ نتیجہ۔ حذف شدہ شمار کوڈ کو چلنے سے روکنے کے لیے پراپرٹی اگر ڈیٹا بیس خالی ہے یا آبجیکٹ ID غلط ہے۔

کیا یہ PS4 خریدنے کے قابل ہے؟

API رنر فائل بنائیں

آخر میں، ایک بنائیں main.go آپ کے پروجیکٹ کی روٹ ڈائرکٹری کے اندر۔ آپ کا حتمی پروجیکٹ ڈھانچہ اس طرح نظر آنا چاہئے:

  گولانگ 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")
}

یہ فائل اہم پیکیج ہے جو دوسری فائلوں کو چلاتا ہے۔ یہ روٹ ہینڈلرز کو درآمد کرکے شروع ہوتا ہے۔ اگلا ہے راؤٹر متغیر، a جن مثال جو HTTP ایکشنز کو جنم دیتی ہے اور ہر اینڈ پوائنٹ کو اس کے فنکشن کے نام سے کال کرتی ہے۔ راستے پیکج

آپ کا CRUD پروجیکٹ جاری ہے۔ لوکل ہوسٹ: 3000 . سرور چلانے کے لیے اور CRUD API کی جانچ کریں۔ ، اپنی بیس ڈائرکٹری میں درج ذیل کمانڈ کو چلائیں:

go run main.go

اپنے گولانگ CRUD پروجیکٹ کو قابل استعمال پروڈکٹ میں تبدیل کریں۔

آپ نے Go کے ساتھ کامیابی کے ساتھ ایک CRUD API بنایا ہے۔ مبارک ہو! اگرچہ یہ ایک معمولی پروجیکٹ ہے، آپ نے دیکھا ہے کہ گو میں باقاعدہ HTTP درخواستوں کو انجام دینے میں کیا ہوتا ہے۔

آپ اسے ایک زیادہ عملی ایپلیکیشن میں پھیلا کر مزید تخلیقی حاصل کر سکتے ہیں جو صارفین کو قدر فراہم کرتی ہے۔ گو بہت سے استعمال کے معاملات کے لیے ایک موزوں پروگرامنگ زبان ہے۔