خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه ایجاد یک CRUD API با Golang’s Gin و MongoDB

ایجاد یک API پایه در Go با استفاده از کتابخانه Gin آسان است. آن را با یک باطن MongoDB تکمیل کنید و برنامه CRUD شما در کمترین زمان راه اندازی و اجرا می شود.

Golang یکی از پردرآمدترین زبان های برنامه نویسی پر تقاضا با کاربردهای فراوان است. هنگامی که با فریمورک هایی مانند Gin، Revel و gorilla/mux جفت می شوید، می توانید به راحتی یک API با Go ایجاد کنید.

نحوه ایجاد CRUD API در Golang با استفاده از چارچوب HTTP Gin را بیاموزید.

راه اندازی و نصب اولیه

اگر قبلاً این کار را نکرده اید، با نصب آن بر روی رایانه خود با Golang شروع کنید.

پس از نصب، گام بعدی این است که یک پوشه ریشه پروژه بر روی دستگاه خود ایجاد کنید و یک ماژول Go را در آن دایرکتوری ریشه مقداردهی کنید.

برای انجام این کار، یک CLI را باز کنید، به پوشه ریشه پروژه خود بروید و اجرا کنید:

go mod init module_name

وقتی فایل go.mod را باز می کنید، نام ماژول خود (به عنوان مثال CRUD_API) و نسخه آن را خواهید دید. همه بسته های سفارشی از این ماژول والد می آیند. بنابراین هر بسته سفارشی وارد شده به شکل زیر است:

import(package CRUD_API/package-directory-name)

در مرحله بعد، بسته های لازم برای ایجاد CRUD API را نصب کنید. در این مورد، از Gin Gonic برای مسیریابی نقاط انتهایی API استفاده کنید:

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 ایجاد کنید و نام آن را 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
}

بهترین روش پنهان کردن متغیرهای محیطی مانند رشته اتصال پایگاه داده در یک فایل env. با استفاده از بسته dotenv است. این باعث می شود کد شما قابل حمل تر باشد و برای مثال هنگام استفاده از یک نمونه خوشه ابری MongoDB مفید باشد.

مطلب مرتبط:   نحوه پورت برنامه جاوا اسکریپت خود به TypeScript

تابع ConnectDB یک اتصال برقرار می کند و یک شی MongoDB Client جدید را برمی گرداند.

ایجاد مجموعه پایگاه داده

MongoDB داده‌ها را در مجموعه‌ها ذخیره می‌کند، که یک رابط برای داده‌های پایگاه داده زیربنایی فراهم می‌کند.

برای مدیریت عملکرد جمع آوری، با ایجاد یک پوشه جدید به نام Collection در ریشه پروژه خود شروع کنید. اکنون یک فایل 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 است که مجموعه آن Posts است.

مدل پایگاه داده را ایجاد کنید

یک پوشه جدید در دایرکتوری ریشه خود بسازید و آن را مدل بنامید. این پوشه مدل پایگاه داده شما را مدیریت می کند.

یک فایل Go جدید در داخل آن پوشه ایجاد کنید و آن را model.go بنامید. مدل شما، در این مورد، یک پست وبلاگ با عنوان آن است:

package model
 
import (
"go.mongodb.org/mongo-driver/bson/primitive"
)
 
type Post struct {
IDprimitive.ObjectID
Title string
Article string
}

ایجاد یک CRUD API با Go

بعدی ایجاد CRUD API است. برای شروع با این بخش، یک پوشه جدید در دایرکتوری ریشه پروژه خود بسازید تا نقاط پایانی شما را مدیریت کند. به آن مسیرها می گویند.

برای هر عمل یک فایل Go جداگانه در این پوشه ایجاد کنید. به عنوان مثال، می توانید نام آنها را create.go، read.go، update.go و delete.go بگذارید. شما این کنترل کننده ها را به عنوان بسته مسیرها صادر خواهید کرد.

نحوه ایجاد نقطه پایانی POST در Go

با تعریف نقطه پایانی POST برای نوشتن داده ها در پایگاه داده شروع کنید.

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

این کد با وارد کردن ماژول های سفارشی پروژه شروع می شود. سپس بسته های شخص ثالث از جمله Gin و MongoDB Driver را وارد می کند.

مطلب مرتبط:   7 بهترین برنامه یادداشت برداری برای برنامه نویسان و برنامه نویسان

علاوه بر این، postCollection مجموعه پایگاه داده را نگه می دارد. قابل توجه، c.BindJSON(“post”) یک نمونه مدل JSONified است که هر فیلد مدل را به عنوان postPayload فراخوانی می کند. این به پایگاه داده می رود.

نحوه ایجاد نقطه پایانی GET

نقطه پایانی GET، در routes/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})
}

متغیر postId یک اعلان پارامتر است. شناسه شی سند را به عنوان 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 $set برای به روز رسانی یک سند مورد نیاز که توسط شناسه شی آن فراخوانی شده است استفاده می کند.

اگر رکوردی در پایگاه داده وجود نداشته باشد یا شناسه ارسال شده نامعتبر باشد، شرط result.MatchedCount از اجرای کد جلوگیری می‌کند.

مطلب مرتبط:   JSON Serialization و Deserialization With Rust

ایجاد نقطه پایانی DELETE

نقطه پایانی 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})
}

این کد با استفاده از تابع DeleteOne یک رکورد را حذف می کند. همچنین از ویژگی result.DeletedCount برای جلوگیری از اجرای کد در صورت خالی بودن پایگاه داده یا نامعتبر بودن شناسه شی استفاده می کند.

فایل API Runner را ایجاد کنید

در نهایت، یک 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")
}

این فایل بسته اصلی است که فایل های دیگر را اجرا می کند. با وارد کردن کنترل کننده های مسیر شروع می شود. بعدی متغیر روتر است، یک نمونه جین که اقدامات HTTP را برمی انگیزد و هر نقطه پایانی را با نام تابع خود از بسته مسیرها فرا می خواند.

پروژه CRUD شما روی localhost:3000 اجرا می شود. برای اجرای سرور و تست CRUD API، دستور زیر را در دایرکتوری پایه خود اجرا کنید:

go run main.go

پروژه Golang CRUD خود را به یک محصول قابل استفاده تبدیل کنید

شما با موفقیت یک CRUD API را با Go ایجاد کردید. تبریک می گویم! در حالی که این یک پروژه جزئی است، اما مشاهده کرده اید که برای اجرای درخواست های HTTP معمولی در Go چه چیزی لازم است.

می‌توانید با گسترش این برنامه به یک برنامه کاربردی‌تر که ارزشی را به کاربران ارائه می‌کند، خلاق‌تر شوید. Go یک زبان برنامه نویسی مناسب برای طیف وسیعی از موارد استفاده است.