Golang jest jednym z najlepiej płatnych, pożądanych języków programowania z wieloma aplikacjami. W połączeniu z frameworkami, takimi jak Gin, Revel i gorilla/mux, możesz łatwo utworzyć API za pomocą Go.
Dowiedz się, jak stworzyć CRUD API w Golangu przy użyciu frameworka Gin HTTP.
MAKEUSEOF WIDEO DNIA
Wstępna konfiguracja i instalacja
Zacznij korzystać z Golang instalując go na swoim komputerze, jeśli jeszcze tego nie zrobiłeś.
Po zainstalowaniu następnym krokiem jest utworzenie folderu głównego projektu na komputerze i zainicjowanie modułu Go w tym katalogu głównym.
Aby to zrobić, otwórz CLI , przejdź do folderu głównego projektu i uruchom:
go mod init module_name
Zobaczysz nazwę swojego modułu (np. CRUD_API ) i jego wersję po otwarciu go.mod plik. Wszystkie niestandardowe pakiety będą pochodzić z tego modułu nadrzędnego. Tak więc każdy importowany pakiet niestandardowy przyjmuje postać:
import(package CRUD_API/package-directory-name)
Następnie zainstaluj pakiety niezbędne do stworzenia CRUD API. W takim przypadku użyj Gin Gonic do trasowania punktów końcowych API:
go get github.com/gin-gonic/gin
Teraz zainstaluj sterownik MongoDB do przechowywania danych:
go get go.mongodb.org/mongo-driver/mongo
Jak się połączyć Przejdź do MongoDB
Wszystko, czego potrzebujesz, to Twój MongoDB URI, aby połączyć Golanga z bazą danych. Zwykle wygląda to tak, jeśli łączysz się lokalnie z MongoDB Atlas:
jak się dowiedzieć, kiedy utworzyłeś swoje konto google
Mongo_URL = "mongodb://127.0.0.1:27017"
Teraz utwórz nowy folder w katalogu głównym projektu i nazwij go bazy danych . Utwórz plik Go w tym folderze i nazwij go baza.go .
To jest twój pakiet bazy danych, który zaczyna się od zaimportowania wymaganych bibliotek:
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
}
Najlepszą praktyką jest ukrycie zmiennych środowiskowych, takich jak ciąg połączenia z bazą danych w .env plik korzystanie z pakietu dotenv . Dzięki temu Twój kod jest bardziej przenośny i przydaje się podczas korzystania z Instancja klastra w chmurze MongoDB , na przykład.
The ConnectDB funkcja nawiązuje połączenie i zwraca nowy obiekt MongoDB Client.
Utwórz kolekcję bazy danych
MongoDB przechowuje dane w kolekcjach, które zapewniają interfejs do danych bazowych.
Aby obsłużyć funkcję pobierania kolekcji, zacznij od utworzenia nowego folderu, Kolekcja , w katalogu głównym projektu. Teraz utwórz nowy plik Go, getCollection.go , który pobiera kolekcję z bazy danych:
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
}
Ta funkcja pobiera kolekcję z bazy danych MongoDB. W tym przypadku nazwa bazy danych to myGoappDB , z Posty jako jego kolekcję.
Utwórz model bazy danych
Utwórz nowy folder w katalogu głównym i wywołaj go Model . Ten folder obsługuje model bazy danych.
Utwórz nowy plik Go w tym folderze i nazwij go model.go . Twój model, w tym przypadku, to post na blogu o tytule:
jak znaleźć adres IP mojego telefonu z Androidem?
package model
import (
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Post struct {
ID primitive.ObjectID
Title string
Article string
}
Tworzenie API CRUD z Go
Następnym krokiem jest stworzenie CRUD API. Aby rozpocząć od tej sekcji, utwórz nowy folder w katalogu głównym projektu do obsługi punktów końcowych. Nazwać trasy .
Utwórz osobny plik Go w tym folderze dla każdej akcji. Na przykład możesz je nazwać utwórz.go , przeczytaj.go , aktualizacja.go , oraz usuń.go . Wyeksportujesz te programy obsługi jako trasy pakiet.
Jak utworzyć punkt końcowy POST w Go
Zacznij od zdefiniowania punktu końcowego POST do zapisywania danych w bazie danych.
W środku trasy/utwórz.go , dodaj następujące:
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}})
}
Ten kod rozpoczyna się od zaimportowania niestandardowych modułów projektu. Następnie importuje pakiety innych firm, w tym Gin oraz Sterownik MongoDB .
Dalej, postKolekcja przechowuje kolekcję bazy danych. Szczególnie, c.BindJSON('post') jest instancją modelu JSONified, która wywołuje każde pole modelu jako postPayload ; trafia do bazy danych.
Jak utworzyć punkt końcowy GET
Punkt końcowy GET, w trasy/read.go , odczytuje pojedynczy dokument z bazy danych za pomocą swojego unikalnego identyfikatora. Rozpoczyna się również od importu pakietów niestandardowych i innych firm:
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})
}
The posty zmienna jest deklaracją parametru. Pobiera identyfikator obiektu dokumentu jako identyfikator obiektu .
Jednakże, wynik jest instancją modelu bazy danych, która później przechowuje zwrócony dokument jako res .
Jak utworzyć punkt końcowy PUT
Program obsługi PUT, w trasy/update.go , jest podobny do procedury obsługi POST. Tym razem aktualizuje istniejący post o unikalny identyfikator obiektu:
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})
}
Format JSON instancji modelu ( Poczta ) wywołuje każdą zmienną modelu z bazy danych. Zmienna wynikowa używa MongoDB $zestaw operatora, aby zaktualizować wymagany dokument wywoływany przez jego identyfikator obiektu.
The wynik.MatchedCount warunek uniemożliwia uruchomienie kodu, jeśli nie ma rekordu w bazie danych lub przekazany identyfikator jest nieprawidłowy.
Tworzenie DELETE Endpoint
Punkt końcowy DELETE, w usuń.go , usuwa dokument na podstawie identyfikatora obiektu przekazanego jako parametr adresu URL:
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})
}
Ten kod usuwa rekord za pomocą Usuńjeden funkcjonować. Wykorzystuje również wynik.DeletedCount właściwość, aby zapobiec uruchomieniu kodu, jeśli baza danych jest pusta lub identyfikator obiektu jest nieprawidłowy.
Utwórz plik programu uruchamiającego API
Na koniec utwórz main.go wewnątrz katalogu głównego projektu. Twoja ostateczna struktura projektu powinna wyglądać tak:
Ten plik obsługuje wykonanie routera dla każdego punktu końcowego:
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")
}
Ten plik jest głównym pakietem, który uruchamia inne pliki. Zaczyna się od zaimportowania programów obsługi tras. Dalej jest router zmienna, a Gin instancja, która wywołuje akcje HTTP i wywołuje każdy punkt końcowy przez nazwę funkcji z trasy pakiet.
Twój projekt CRUD działa Lokalny Gospodarz: 3000 . Aby uruchomić serwer i przetestuj CRUD API , uruchom następujące polecenie w swoim katalogu podstawowym:
jak zrobić nowy adres e-mail
go run main.go
Zmień swój projekt Golang CRUD w użyteczny produkt
Pomyślnie utworzyłeś CRUD API za pomocą Go; Gratulacje! Chociaż jest to niewielki projekt, widziałeś już, jak wykonać zwykłe żądania HTTP w Go.
Możesz zwiększyć swoją kreatywność, rozszerzając to na bardziej praktyczną aplikację, która zapewnia użytkownikom wartość. Go to odpowiedni język programowania dla wielu przypadków użycia.