Maison > Article > développement back-end > Go et MongoDB : créer une API CRUD à partir de zéro
Vous souhaitez créer une application Web dynamique avec un backend robuste ? Ne cherchez pas plus loin que Go et MongoDB ! Cette combinaison puissante vous permet de créer des API évolutives et efficaces qui gèrent facilement la création, la lecture, la mise à jour et la suppression (CRUD) de données.
Dans ce guide convivial pour les débutants, nous expliquerons le processus de création d'une API CRUD simple à l'aide de Go et MongoDB. Nous couvrirons les étapes essentielles, fournirons des exemples de code et parsèmerons de conseils utiles en cours de route.
Tout d'abord, configurons notre environnement :
Structure du projet :
Créez un nouveau répertoire de projet et organisez vos fichiers comme ceci :
my-crud-api/ ├── main.go ├── models/ │ └── user.go ├── handlers/ │ └── user.go └── config/ └── config.go
Commençons par définir notre modèle de données. Pour cet exemple, nous allons créer une simple structure 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"` }
Explication :
Nous devons établir une connexion à notre base de données MongoDB. Créez un fichier config.go dans le répertoire config :
// 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 }
Explication :
Maintenant, construisons les gestionnaires d'API pour nos opérations CRUD. Dans le répertoire des gestionnaires, créez un fichier 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) }
Explication :
Enfin, lions le tout ensemble dans notre fichier 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)) }
Explication :
Vous pouvez tester votre API à l'aide d'outils comme Postman ou curl.
Félicitations ! Vous avez réussi à créer une API CRUD de base à l'aide de Go et MongoDB. Avec cette base, vous pouvez étendre votre API pour gérer des fonctionnalités plus complexes et créer des applications Web impressionnantes. Continuez à apprendre et à explorer les possibilités infinies de Go et MongoDB !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!