Heim > Artikel > Backend-Entwicklung > Go und MongoDB: Erstellen einer CRUD-API von Grund auf
Möchten Sie eine dynamische Webanwendung mit einem robusten Backend erstellen? Suchen Sie nicht weiter als Go und MongoDB! Mit dieser leistungsstarken Kombination können Sie skalierbare, effiziente APIs erstellen, die das Erstellen, Lesen, Aktualisieren und Löschen von Daten (CRUD) problemlos handhaben.
In diesem einsteigerfreundlichen Leitfaden führen wir Sie durch den Prozess der Erstellung einer einfachen CRUD-API mit Go und MongoDB. Wir werden die wesentlichen Schritte behandeln, Codebeispiele bereitstellen und nebenbei nützliche Tipps einstreuen.
Das Wichtigste zuerst: Richten wir unsere Umgebung ein:
Projektstruktur:
Erstellen Sie ein neues Projektverzeichnis und organisieren Sie Ihre Dateien wie folgt:
my-crud-api/ ├── main.go ├── models/ │ └── user.go ├── handlers/ │ └── user.go └── config/ └── config.go
Beginnen wir mit der Definition unseres Datenmodells. Für dieses Beispiel erstellen wir eine einfache Benutzerstruktur:
// 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"` }
Erklärung:
Wir müssen eine Verbindung zu unserer MongoDB-Datenbank herstellen. Erstellen Sie eine config.go-Datei im Konfigurationsverzeichnis:
// 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 }
Erklärung:
Jetzt erstellen wir die API-Handler für unsere CRUD-Operationen. Erstellen Sie im Handler-Verzeichnis eine user.go-Datei:
// 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) }
Erklärung:
Zum Schluss binden wir alles in unserer main.go-Datei zusammen:
// 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)) }
Erklärung:
Sie können Ihre API mit Tools wie Postman oder Curl testen.
Herzlichen Glückwunsch! Sie haben erfolgreich eine grundlegende CRUD-API mit Go und MongoDB erstellt. Auf dieser Grundlage können Sie Ihre API erweitern, um komplexere Funktionen zu bewältigen und beeindruckende Webanwendungen zu erstellen. Lernen Sie weiter und erkunden Sie die endlosen Möglichkeiten von Go und MongoDB!
Das obige ist der detaillierte Inhalt vonGo und MongoDB: Erstellen einer CRUD-API von Grund auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!