Golang の Gin と MongoDB を使用して CRUD API を作成する方法

Golang の Gin と MongoDB を使用して CRUD API を作成する方法

Golang は、多くのアプリケーションを備えた、最も売れ行きが良く需要の高いプログラミング言語の 1 つです。 Gin、Revel、gorilla/mux などのフレームワークと組み合わせると、Go で API を簡単に作成できます。





Gin HTTP フレームワークを使用して Golang で CRUD API を作成する方法を学びます。





今日のメイク動画

初期セットアップとインストール

Golang を使い始める まだインストールしていない場合は、コンピュータにインストールしてください。





インストールしたら、次のステップは、マシン上にプロジェクト ルート フォルダーを作成し、そのルート ディレクトリで Go モジュールを初期化することです。

これを行うには、 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 への接続方法

必要なのは、Golang をデータベースに接続するための 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
}

データベース接続文字列などの環境変数を非表示にすることをお勧めします。 .env ファイル dotenv パッケージの使用 .これにより、コードの移植性が向上し、 MongoDB クラウド クラスター インスタンス 、 例えば。

ConnectDB 関数は接続を確立し、新しい MongoDB Client オブジェクトを返します。

データベース コレクションの作成

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 データベースから Collection を取得します。この場合のデータベース名は 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 read.go update.go 、 と delete.go .これらのハンドラを ルート パッケージ。

Go で POST エンドポイントを作成する方法

データベースにデータを書き込む POST エンドポイントを定義することから始めます。

Windows10用の最高のフォトビューア

中身 ルート/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 ドライバー .

さらに遠く、 投稿コレクション データベース コレクションを保持します。特に、 c.BindJSON('投稿') 各モデル フィールドを次のように呼び出す JSON 化されたモデル インスタンスです。 postPayload ;これはデータベースに入ります。

GET エンドポイントを作成する方法

GET エンドポイント ルート/read.go 、一意の ID を介してデータベースから 1 つのドキュメントを読み取ります。また、カスタムおよびサードパーティのパッケージをインポートすることから始めます。

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

投稿 variable はパラメーター宣言です。ドキュメントのオブジェクト ID を次のように取得します。 オブジェクト ID .

でも、 結果 データベース モデルのインスタンスであり、後で返されたドキュメントを次のように保持します。 解像度 .

PUT エンドポイントを作成する方法

PUT ハンドラ ルート/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 形式 ( 役職 ) は、データベースから各モデル フィールドを呼び出します。結果変数は MongoDB を使用します $セット オブジェクト ID によって呼び出される必要なドキュメントを更新する演算子。

result.MatchedCount データベースにレコードがない場合、または渡された ID が無効な場合、コードは実行されません。

DELETE エンドポイントの作成

の DELETE エンドポイント delete.go 、URL パラメーターとして渡されたオブジェクト 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})
}

このコードは、 一つ削除 関数。また、 result.DeletedCount データベースが空の場合、またはオブジェクト ID が無効な場合にコードが実行されないようにするプロパティ。

API ランナー ファイルを作成する

最後に、 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")
}

このファイルは、他のファイルを実行するメイン パッケージです。まず、ルート ハンドラをインポートします。次は ルーター 変数、a ジン HTTP アクションを呼び出し、各エンドポイントを関数名で呼び出します。 ルート パッケージ。

CRUD プロジェクトは次の場所で実行されます ローカルホスト:3000 .サーバーを実行するには CRUD API をテストする で、ベース ディレクトリで次のコマンドを実行します。

go run main.go

Golang CRUD プロジェクトを使用可能な製品に変える

Go を使用して CRUD API を作成しました。おめでとう!これは小さなプロジェクトですが、Go で通常の HTTP リクエストを実行するために何が必要かを見てきました。

これをユーザーに価値を提供するより実用的なアプリケーションに拡張することで、より創造的になることができます。 Go は、さまざまなユースケースに適したプログラミング言語です。