গোলং এর জিন এবং মঙ্গোডিবি দিয়ে কীভাবে একটি CRUD API তৈরি করবেন

গোলং এর জিন এবং মঙ্গোডিবি দিয়ে কীভাবে একটি CRUD API তৈরি করবেন

গোল্যাং হল অনেকগুলি অ্যাপ্লিকেশন সহ শীর্ষ-প্রদানকারী, ইন-ডিমান্ড প্রোগ্রামিং ভাষাগুলির মধ্যে একটি। Gin, Revel, এবং gorilla/mux এর মত ফ্রেমওয়ার্কের সাথে পেয়ার করা হলে, আপনি সহজেই Go এর সাথে একটি API তৈরি করতে পারেন।





জিন এইচটিটিপি ফ্রেমওয়ার্ক ব্যবহার করে গোলং-এ কীভাবে একটি 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 URI। আপনি স্থানীয়ভাবে MongoDB Atlas এর সাথে সংযোগ করলে এটি সাধারণত এইরকম দেখায়:





Mongo_URL = "mongodb://127.0.0.1:27017"

এখন আপনার প্রোজেক্ট রুট ডিরেক্টরিতে একটি নতুন ফোল্ডার তৈরি করুন এবং এটি কল করুন ডাটাবেস . এই ফোল্ডারের ভিতরে একটি Go ফাইল তৈরি করুন এবং এটির নাম দিন 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 প্যাকেজ ব্যবহার করে . এটি আপনার কোডকে আরও বহনযোগ্য করে তোলে এবং a ব্যবহার করার সময় কাজে আসে MongoDB ক্লাউড ক্লাস্টার উদাহরণ , উদাহরণ স্বরূপ.

দ্য কানেক্ট ডিবি ফাংশন একটি সংযোগ স্থাপন করে এবং একটি নতুন 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 ফাইল তৈরি করুন এবং এটি কল করুন মডেল.গো . আপনার মডেল, এই ক্ষেত্রে, এটির শিরোনাম সহ একটি ব্লগ পোস্ট:

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 তৈরি. এই বিভাগটি দিয়ে শুরু করতে, আপনার শেষ পয়েন্টগুলি পরিচালনা করার জন্য আপনার প্রকল্প রুট ডিরেক্টরির মধ্যে একটি নতুন ফোল্ডার তৈরি করুন। ডাকা রুট .

প্রতিটি কর্মের জন্য এই ফোল্ডারে একটি পৃথক Go ফাইল তৈরি করুন। উদাহরণস্বরূপ, আপনি তাদের নাম দিতে পারেন create.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})
}

দ্য পোস্ট পরিবর্তনশীল একটি প্যারামিটার ঘোষণা। এটি একটি নথির অবজেক্ট আইডি হিসাবে পায় objId .

যাহোক, ফলাফল ডাটাবেস মডেলের একটি উদাহরণ, যা পরে প্রত্যাবর্তিত নথিটিকে হিসাবে ধরে রাখে res .

কিভাবে PUT এন্ডপয়েন্ট তৈরি করবেন

PUT হ্যান্ডলার, মধ্যে routes/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 ব্যবহার করে $সেট অপারেটর তার অবজেক্ট আইডি দ্বারা ডাকা একটি প্রয়োজনীয় নথি আপডেট করতে।

দ্য ফলাফল। মিলিত গণনা কন্ডিশন কোডটিকে চলতে বাধা দেয় যদি ডাটাবেসে কোনো রেকর্ড না থাকে বা পাস করা আইডি অবৈধ হয়।

একটি ডিলিট এন্ডপয়েন্ট তৈরি করা হচ্ছে

DELETE শেষ বিন্দু, মধ্যে 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})
}

এই কোডটি ব্যবহার করে একটি রেকর্ড মুছে দেয় ডিলিট ওয়ান ফাংশন এটিও ব্যবহার করে ফলাফল.মুছে ফেলা গণনা ডাটাবেস খালি থাকলে বা অবজেক্ট আইডি অবৈধ হলে কোডটি চালানো থেকে বিরত করার জন্য বৈশিষ্ট্য।

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

এই ফাইলটি হল প্রধান প্যাকেজ যা অন্যান্য ফাইল চালায়। এটি রুট হ্যান্ডলার আমদানি করে শুরু হয়। পরবর্তী হল রাউটার পরিবর্তনশীল, ক জিন দৃষ্টান্ত যা এইচটিটিপি অ্যাকশনকে উদ্দীপিত করে এবং প্রতিটি এন্ডপয়েন্টকে তার ফাংশনের নাম দিয়ে কল করে রুট প্যাকেজ

আপনার CRUD প্রকল্প চলছে স্থানীয় হোস্ট: 3000 . সার্ভার চালানোর জন্য এবং CRUD API পরীক্ষা করুন , আপনার বেস ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালান:

go run main.go

আপনার গোলং CRUD প্রকল্পকে একটি ব্যবহারযোগ্য পণ্যে পরিণত করুন

আপনি Go এর সাথে সফলভাবে একটি CRUD API তৈরি করেছেন; অভিনন্দন! যদিও এটি একটি ছোট প্রকল্প, আপনি Go-তে নিয়মিত HTTP অনুরোধগুলি কার্যকর করতে কী লাগে তা দেখেছেন৷

আপনি এটিকে আরও ব্যবহারিক অ্যাপ্লিকেশনে প্রসারিত করে আরও সৃজনশীল পেতে পারেন যা ব্যবহারকারীদের কাছে মূল্য প্রদান করে। বিভিন্ন ব্যবহারের ক্ষেত্রে গো একটি উপযুক্ত প্রোগ্রামিং ভাষা।