ホームページ  >  記事  >  バックエンド開発  >  Go と MongoDB: CRUD API をゼロから構築する

Go と MongoDB: CRUD API をゼロから構築する

王林
王林オリジナル
2024-07-18 08:55:05773ブラウズ

Go and MongoDB: Building a CRUD API from Scratch

堅牢なバックエンドを備えた動的な Web アプリケーションを作成したいですか? Go と MongoDB 以外に探す必要はありません。この強力な組み合わせにより、データの作成、読み取り、更新、削除 (CRUD) を簡単に処理する、スケーラブルで効率的な API を構築できます。

この初心者向けガイドでは、Go と MongoDB を使用してシンプルな CRUD API を構築するプロセスを順を追って説明します。重要な手順を説明し、コード例を示し、途中で役立つヒントを散りばめます。

はじめる

まず最初に、環境をセットアップしましょう:

  1. Go のインストール: https://go.dev/dl/ から Go の最新バージョンをダウンロードしてインストールします。
  2. MongoDB のセットアップ: MongoDB を実行していない場合は、https://www.mongodb.com/try/download/community からダウンロードしてインストールできます。
  3. IDE またはテキスト エディタ: 好みのコーディング環境を選択します。人気のあるオプションには、VS Code、GoLand、Atom などがあります。

プロジェクト構造:

新しいプロジェクト ディレクトリを作成し、次のようにファイルを整理します。

my-crud-api/
├── main.go
├── models/
│   └── user.go
├── handlers/
│   └── user.go
└── config/
    └── config.go

モデルの定義

データモデルの定義から始めましょう。この例では、単純な User 構造体を作成します:

// models/user.go
package models

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

type User struct {
    ID     primitive.ObjectID `bson:"_id,omitempty"`
    Name   string             `bson:"name,omitempty"`
    Email  string             `bson:"email,omitempty"`
    Age    int                `bson:"age,omitempty"`
    Active bool               `bson:"active,omitempty"`
}

説明:

  • 一意の MongoDB ドキュメント ID を表すために、mongo-driver パッケージの primitive.ObjectID を使用します。
  • bson タグは、Go 構造体フィールドを MongoDB ドキュメント内の対応するフィールドにマッピングするために重要です。

MongoDB への接続

MongoDB データベースへの接続を確立する必要があります。 config ディレクトリに config.go ファイルを作成します:

// config/config.go
package config

import (
    "context"
    "fmt"
    "os"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectToMongoDB() (*mongo.Client, error) {
    uri := os.Getenv("MONGODB_URI")
    if uri == "" {
        return nil, fmt.Errorf("MONGODB_URI is not set")
    }

    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        return nil, err
    }

    err = client.Ping(context.Background(), nil)
    if err != nil {
        return nil, err
    }

    return client, nil
}

説明:

  • os.Getenv を使用して、環境変数 MONGODB_URI から MongoDB 接続 URI を取得します。必ずこの変数を環境に設定してください。
  • mongo-driver パッケージを使用して MongoDB データベースに接続し、データベースへの ping などの基本的な操作を実行します。

ハンドラーの構築

次に、CRUD 操作用の API ハンドラーを構築しましょう。 handlers ディレクトリに user.go ファイルを作成します:

// handlers/user.go
package handlers

import (
    "context"
    "encoding/json"
    "fmt"
    "net/http"

    "github.com/your-username/my-crud-api/config"
    "github.com/your-username/my-crud-api/models"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
)

// Create a new user
func CreateUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    var user models.User
    if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    result, err := collection.InsertOne(context.Background(), user)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

// Get all users
func GetAllUsers(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    collection := client.Database("your_database_name").Collection("users")
    cursor, err := collection.Find(context.Background(), bson.D{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer cursor.Close(context.Background())

    var users []models.User
    for cursor.Next(context.Background()) {
        var user models.User
        if err := cursor.Decode(&user); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        users = append(users, user)
    }

    json.NewEncoder(w).Encode(users)
}

// Get a user by ID
func GetUserByID(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    var user models.User
    if err := collection.FindOne(context.Background(), bson.M{"_id": id}).Decode(&user); err != nil {
        http.Error(w, err.Error(), http.StatusNotFound)
        return
    }

    json.NewEncoder(w).Encode(user)
}

// Update a user
func UpdateUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    var updatedUser models.User
    if err := json.NewDecoder(r.Body).Decode(&updatedUser); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    filter := bson.M{"_id": id}
    update := bson.M{"$set": updatedUser}
    result, err := collection.UpdateOne(context.Background(), filter, update)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

// Delete a user
func DeleteUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    result, err := collection.DeleteOne(context.Background(), bson.M{"_id": id})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

説明:

  • CreateUser、GetAllUsers、GetUserByID、UpdateUser、および DeleteUser の CRUD 操作を実装します。
  • 各関数は MongoDB に接続し、コレクションを取得し、それぞれの操作を実行して、JSON 応答を返します。
  • 潜在的なエラーを処理し、適切な HTTP ステータス コードを返します。

メインアプリケーションのセットアップ

最後に、すべてを main.go ファイルにまとめてみましょう:

// main.go
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/your-username/my-crud-api/handlers"
)

func main() {
    http.HandleFunc("/users", handlers.CreateUser)
    http.HandleFunc("/users", handlers.GetAllUsers)
    http.HandleFunc("/users/", handlers.GetUserByID)
    http.HandleFunc("/users/", handlers.UpdateUser)
    http.HandleFunc("/users/", handlers.DeleteUser)

    fmt.Println("Server running on port 8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

説明:

  • API ハンドラーを対応する HTTP エンドポイントに登録します。
  • サーバーを起動し、ポート 8080 でリッスンします。

APIの実行

  1. 環境変数: MongoDB 接続文字列を使用して MONGODB_URI 環境変数を設定します。
  2. ビルドと実行: go build を使用して Go アプリケーションをビルドし、./my-crud-api を使用して実行します。

API のテスト

Postman やcurl などのツールを使用して API をテストできます。

  • 作成: ユーザーの詳細を含む JSON ペイロードを含む POST リクエストを /users に送信します。
  • 読み取り: GET リクエストを /users に送信してすべてのユーザーを取得するか、/users/?id={user_id} に送信して特定のユーザーを取得します。
  • 更新: 更新されたユーザーの詳細を含む JSON ペイロードを含む PUT リクエストを /users/?id={user_id} に送信します。
  • 削除: ユーザーを削除するには、DELETE リクエストを /users/?id={user_id} に送信します。

成功のヒント

  • エラー処理: 潜在的なエラーを常に処理し、意味のある HTTP ステータス コードを返します。
  • セキュリティ: API に適切な認証および認可メカニズムを実装します。
  • データベース設計: パフォーマンスとスケーラビリティを最適化するために、データベース スキーマを慎重に設計します。
  • ドキュメント: API エンドポイント、リクエスト/レスポンス形式、エラー コードを文書化します。

おめでとうございます! Go と MongoDB を使用して基本的な CRUD API を構築することに成功しました。この基盤を使用すると、API を拡張してより複雑な機能を処理し、優れた Web アプリケーションを構築できます。 Go と MongoDB の無限の可能性を学び、探求し続けてください!

以上がGo と MongoDB: CRUD API をゼロから構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。