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 プロジェクトのルート ディレクトリ内。最終的なプロジェクト構造は次のようになります。
このファイルは、各エンドポイントのルーター実行を処理します。
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 は、さまざまなユースケースに適したプログラミング言語です。