Η Golang είναι μια από τις πιο ακριβοπληρωμένες, σε ζήτηση γλώσσες προγραμματισμού με πολλές εφαρμογές. Όταν συνδυάζονται με πλαίσια όπως το Gin, το Revel και το gorilla/mux, μπορείτε εύκολα να δημιουργήσετε ένα API με το Go.
Μάθετε πώς να δημιουργείτε ένα CRUD API στο Golang χρησιμοποιώντας το πλαίσιο Gin HTTP.
Αρχική εγκατάσταση και εγκατάσταση
Ξεκινήστε με το Golang εγκαθιστώντας το στον υπολογιστή σας, εάν δεν το έχετε κάνει ήδη.
Μόλις εγκατασταθεί, το επόμενο βήμα είναι να δημιουργήσετε έναν ριζικό φάκελο έργου στον υπολογιστή σας και να αρχικοποιήσετε μια λειτουργική μονάδα Go σε αυτόν τον ριζικό κατάλογο.
Για να το κάνετε αυτό, ανοίξτε ένα CLI, μεταβείτε στον ριζικό φάκελο του έργου σας και εκτελέστε:
go mod init module_name
Θα δείτε το όνομα της μονάδας σας (π.χ. CRUD_API) και την έκδοσή του όταν ανοίγετε το go.mod αρχείο. Όλα τα προσαρμοσμένα πακέτα θα προέρχονται από αυτήν τη γονική μονάδα. Έτσι, κάθε εισαγόμενο προσαρμοσμένο πακέτο έχει τη μορφή:
εισαγωγή(πακέτο CRUD_API/πακέτο-κατάλογος-όνομα)
Στη συνέχεια, εγκαταστήστε τα πακέτα που είναι απαραίτητα για τη δημιουργία του CRUD API. Σε αυτή την περίπτωση, χρησιμοποιήστε Τζιν Γκόνιτς για να δρομολογήσετε τα τελικά σημεία του API:
πηγαίνω παίρνω github.com/gin-gonic/gin
Τώρα εγκαταστήστε το πρόγραμμα οδήγησης MongoDB για αποθήκευση δεδομένων:
πηγαίνω παίρνω go.mongodb.org/mongo-driver/mongo
Πώς να συνδεθείτε Μεταβείτε στο MongoDB
Το μόνο που χρειάζεστε είναι το MongoDB URI σας για να συνδέσετε το Golang με τη βάση δεδομένων. Συνήθως μοιάζει με αυτό εάν συνδέεστε τοπικά στο MongoDB Atlas:
Mongo_URL = "mongodb://127.0.0.1:27017"
Τώρα δημιουργήστε έναν νέο φάκελο στον ριζικό κατάλογο του έργου σας και καλέστε τον βάσεις δεδομένων. Δημιουργήστε ένα αρχείο Go μέσα σε αυτόν τον φάκελο και ονομάστε το βάση δεδομένων.go.
Αυτό είναι το πακέτο της βάσης δεδομένων σας και ξεκινάει με την εισαγωγή των απαιτούμενων βιβλιοθηκών:
πακέτο βάση δεδομένων
εισαγωγή (
"συμφραζόμενα"
"fmt"
"κούτσουρο"
"χρόνος"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)func ConnectDB() *μονγκό. Πελάτης {
Mongo_URL := "mongodb://127.0.0.1:27017"
πελάτης, λάθος := mongo. NewClient (επιλογές. Client().ApplyURI(Mongo_URL))αν λάθος != μηδέν {
κούτσουρο.Μοιραίος(πλανώμαι)
}ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Background(), 10 * φορά. Δεύτερος)
err = πελάτης. Σύνδεση (ctx)
αναβολή ακύρωσης()αν λάθος != μηδέν {
κούτσουρο.Μοιραίος(πλανώμαι)
}
fmt. Println("Συνδέθηκε στο mongoDB")
ΕΠΙΣΤΡΟΦΗ πελάτης
}
Η καλύτερη πρακτική είναι να αποκρύπτετε μεταβλητές περιβάλλοντος όπως η συμβολοσειρά σύνδεσης βάσης δεδομένων σε α .env αρχείο χρησιμοποιώντας το πακέτο dotenv. Αυτό κάνει τον κώδικά σας πιο φορητό και είναι χρήσιμο όταν χρησιμοποιείτε α Παράδειγμα συμπλέγματος σύννεφων MongoDB, για παράδειγμα.
ο ConnectDB συνάρτηση δημιουργεί μια σύνδεση και επιστρέφει ένα νέο αντικείμενο MongoDB Client.
Δημιουργία συλλογής βάσεων δεδομένων
Το MongoDB αποθηκεύει δεδομένα σε Συλλογές, οι οποίες παρέχουν μια διεπαφή στα υποκείμενα δεδομένα βάσης δεδομένων.
Για να χειριστείτε τη λειτουργία ανάκτησης συλλογής, ξεκινήστε δημιουργώντας έναν νέο φάκελο, Συλλογή, στη ρίζα του έργου σας. Τώρα δημιουργήστε ένα νέο αρχείο Go, getCollection.go, που λαμβάνει τη συλλογή από τη βάση δεδομένων:
πακέτο getcollection
εισαγωγή (
"go.mongodb.org/mongo-driver/mongo"
)
funcGetCollection(πελάτης *mongo.Πελάτης, Όνομα συλλογήςσειρά) *mongo.Συλλογή {
συλλογή := πελάτης. Βάση δεδομένων("myGoappDB").Συλλογή("Αναρτήσεις")
ΕΠΙΣΤΡΟΦΗ συλλογή
}
Αυτή η συνάρτηση λαμβάνει τη συλλογή από τη βάση δεδομένων MongoDB. Το όνομα της βάσης δεδομένων, σε αυτήν την περίπτωση, είναι myGoappDB, με Αναρτήσεις ως συλλογή του.
Δημιουργήστε το μοντέλο βάσης δεδομένων
Δημιουργήστε έναν νέο φάκελο μέσα στον ριζικό σας κατάλογο και καλέστε τον μοντέλο. Αυτός ο φάκελος χειρίζεται το μοντέλο της βάσης δεδομένων σας.
Δημιουργήστε ένα νέο αρχείο Go μέσα σε αυτόν τον φάκελο και καλέστε το model.go. Το μοντέλο σας, σε αυτήν την περίπτωση, είναι μια ανάρτηση ιστολογίου με τον τίτλο της:
πακέτο μοντέλο
εισαγωγή (
"go.mongodb.org/mongo-driver/bson/primitive"
)
τύπος Καταχώρηση ανάρτησης {
ταυτότηταπρωτόγονος.Αναγνωριστικό αντικειμένου
Συμβολοσειρά τίτλου
Συμβολοσειρά άρθρου
}
Δημιουργία CRUD API με το Go
Ακολουθεί η δημιουργία CRUD API. Για να ξεκινήσετε με αυτήν την ενότητα, δημιουργήστε έναν νέο φάκελο στον ριζικό κατάλογο του έργου σας για να χειριστείτε τα τελικά σημεία σας. Κάλεσε το διαδρομές.
Δημιουργήστε ένα ξεχωριστό αρχείο Go σε αυτόν τον φάκελο για κάθε ενέργεια. Για παράδειγμα, μπορείτε να τα ονομάσετε δημιουργία.πηγαίνω, διαβάστε.πηγαίνετε, update.go, και delete.go. Θα εξαγάγετε αυτούς τους χειριστές ως διαδρομές πακέτο.
Πώς να δημιουργήσετε το τελικό σημείο POST στο Go
Ξεκινήστε ορίζοντας το τελικό σημείο POST για την εγγραφή δεδομένων στη βάση δεδομένων.
Μέσα routes/create.go, προσθέστε τα ακόλουθα:
πακέτο διαδρομές
εισαγωγή (
getcollection "CRUD_API/Συλλογή"
βάση δεδομένων "CRUD_API/βάσεις δεδομένων"
μοντέλο "CRUD_API/μοντέλο"
"συμφραζόμενα"
"κούτσουρο"
"net/http"
"χρόνος"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)func CreatePost(γ *τζιν. Συμφραζόμενα){
var DB = βάση δεδομένων. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Αναρτήσεις")
ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Background(), 10*time. Δεύτερος)
ανάρτηση := νέος(μοντέλο. Αναρτήσεις)
αναβολή ακύρωσης()αν λάθος := γ. BindJSON(&Θέση); λάθος != μηδέν {
ντο. JSON(http. StatusBadRequest, τζιν. H{"μήνυμα": err})
κούτσουρο.Μοιραίος(πλανώμαι)
ΕΠΙΣΤΡΟΦΗ
}postPayload := μοντέλο. Αναρτήσεις{
Ταυτότητα: πρωτόγονος.NewObjectID(),
Τίτλος: Θέση.Τίτλος,
Αρθρο: Θέση.Αρθρο,
}αποτέλεσμα, err := postCollection. InsertOne (ctx, postPayload)
αν λάθος != μηδέν {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": err})
ΕΠΙΣΤΡΟΦΗ
}
ντο. JSON(http. StatusCreated, τζιν. H{"μήνυμα": "Δημοσιεύτηκε με επιτυχία", "Δεδομένα": map[string]interface{}{"δεδομένα": αποτέλεσμα}})
}
Αυτός ο κωδικός ξεκινάει με την εισαγωγή των προσαρμοσμένων λειτουργικών μονάδων του έργου. Στη συνέχεια εισάγει πακέτα τρίτων συμπεριλαμβανομένων Τζιν και Πρόγραμμα οδήγησης MongoDB.
Περαιτέρω, postCollection κρατά τη συλλογή της βάσης δεδομένων. Ιδιαίτερα, ντο. BindJSON ("ανάρτηση") είναι μια παρουσία μοντέλου JSONified που καλεί κάθε πεδίο μοντέλου ως postPayload; αυτό μπαίνει στη βάση δεδομένων.
Πώς να δημιουργήσετε το τελικό σημείο GET
Το τελικό σημείο GET, σε διαδρομές/διαβάζω.go, διαβάζει ένα μεμονωμένο έγγραφο από τη βάση δεδομένων μέσω του μοναδικού αναγνωριστικού του. Ξεκινά επίσης με την εισαγωγή προσαρμοσμένων πακέτων και πακέτων τρίτων:
πακέτο διαδρομές
εισαγωγή (
getcollection "CRUD_API/Συλλογή"
βάση δεδομένων "CRUD_API/βάσεις δεδομένων"
μοντέλο "CRUD_API/μοντέλο"
"συμφραζόμενα"
"net/http"
"χρόνος"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)func ReadOnePost(γ *τζιν. Συμφραζόμενα){
ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Background(), 10*time. Δεύτερος)
var DB = βάση δεδομένων. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Αναρτήσεις")PostId := γ. Param("postId")
var μοντέλο αποτελέσματος. Αναρτήσειςαναβολή ακύρωσης()
objId, _ := πρωτόγονος. ObjectIDFromHex (postId)
err := postCollection. FindOne (ctx, bson. Μ{"ταυτότητα": objId}).Αποκωδικοποίηση(&αποτέλεσμα)
res := χάρτης[string]διεπαφή{}{"data": αποτέλεσμα}
αν λάθος != μηδέν {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": err})
ΕΠΙΣΤΡΟΦΗ
}
ντο. JSON(http. StatusCreated, τζιν. H{"μήνυμα": "επιτυχία!", "Δεδομένα": res})
}
ο postId μεταβλητή είναι μια δήλωση παραμέτρου. Λαμβάνει το αναγνωριστικό αντικειμένου ενός εγγράφου ως objId.
Ωστόσο, αποτέλεσμα είναι ένα στιγμιότυπο του μοντέλου βάσης δεδομένων, το οποίο αργότερα διατηρεί το επιστρεφόμενο έγγραφο ως res.
Πώς να δημιουργήσετε το τελικό σημείο PUT
Ο χειριστής PUT, μέσα routes/update.go, είναι παρόμοιο με το πρόγραμμα χειρισμού POST. Αυτή τη φορά, ενημερώνει μια υπάρχουσα ανάρτηση με το μοναδικό αναγνωριστικό αντικειμένου:
πακέτο διαδρομές
εισαγωγή (
getcollection "CRUD_API/Συλλογή"
βάση δεδομένων "CRUD_API/βάσεις δεδομένων"
μοντέλο "CRUD_API/μοντέλο"
"συμφραζόμενα"
"net/http"
"χρόνος"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)func UpdatePost(γ *τζιν. Συμφραζόμενα){
ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Background(), 10 * φορά. Δεύτερος)
var DB = βάση δεδομένων. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Αναρτήσεις")PostId := γ. Param("postId")
var μοντέλο ανάρτησης. Αναρτήσειςαναβολή ακύρωσης()
objId, _ := πρωτόγονος. ObjectIDFromHex (postId)
αν λάθος := γ. BindJSON(&Θέση); λάθος != μηδέν {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": err})
ΕΠΙΣΤΡΟΦΗ
}επεξεργάστηκε := bson. Μ{"τίτλος": Θέση. Τίτλος, "άρθρο": Θέση. Αρθρο}
αποτέλεσμα, err := postCollection. UpdateOne (ctx, bson. Μ{"ταυτότητα": objId}, bson. Μ{"$set": επεξεργασία})
res := χάρτης[string]διεπαφή{}{"data": αποτέλεσμα}
αν λάθος != μηδέν {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": err})
ΕΠΙΣΤΡΟΦΗ
}εάν αποτέλεσμα. MatchedCount < 1 {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": "Τα δεδομένα δεν κάνουν'να υπάρχουν"})
ΕΠΙΣΤΡΟΦΗ
}
ντο. JSON(http. StatusCreated, τζιν. H{"μήνυμα": "τα δεδομένα ενημερώθηκαν με επιτυχία!", "Δεδομένα": res})
}
Μια μορφή JSON του στιγμιότυπου μοντέλου (Θέση) καλεί κάθε πεδίο μοντέλου από τη βάση δεδομένων. Η μεταβλητή αποτελέσματος χρησιμοποιεί το MongoDB $set χειριστή για να ενημερώσει ένα απαιτούμενο έγγραφο που καλείται από το αναγνωριστικό αντικειμένου του.
ο αποτέλεσμα. MatchedCount Η συνθήκη εμποδίζει την εκτέλεση του κώδικα εάν δεν υπάρχει εγγραφή στη βάση δεδομένων ή το αναγνωριστικό που έχει περάσει είναι άκυρο.
Δημιουργία τερματικού σημείου DELETE
Το τελικό σημείο DELETE, σε delete.go, καταργεί ένα έγγραφο που βασίζεται στο αναγνωριστικό αντικειμένου που μεταβιβάστηκε ως παράμετρος διεύθυνσης URL:
πακέτο διαδρομές
εισαγωγή (
getcollection "CRUD_API/Συλλογή"
βάση δεδομένων "CRUD_API/βάσεις δεδομένων"
"συμφραζόμενα"
"net/http"
"χρόνος"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)func DeletePost(γ *τζιν. Συμφραζόμενα){
ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Background(), 10*time. Δεύτερος)
var DB = βάση δεδομένων. ConnectDB()
PostId := γ. Param("postId")var postCollection = getcollection. GetCollection (DB, "Αναρτήσεις")
αναβολή ακύρωσης()
objId, _ := πρωτόγονος. ObjectIDFromHex (postId)
αποτέλεσμα, err := postCollection. DeleteOne (ctx, bson. Μ{"ταυτότητα": objId})
res := χάρτης[string]διεπαφή{}{"data": αποτέλεσμα}αν λάθος != μηδέν {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": err})
ΕΠΙΣΤΡΟΦΗ
}εάν αποτέλεσμα. Διαγραμμένος αριθμός < 1 {
ντο. JSON(http. StatusInternalServer Error, gin. H{"μήνυμα": "Δεν υπάρχουν δεδομένα για διαγραφή"})
ΕΠΙΣΤΡΟΦΗ
}
ντο. JSON(http. StatusCreated, τζιν. H{"μήνυμα": "Το άρθρο διαγράφηκε με επιτυχία", "Δεδομένα": res})
}
Αυτός ο κωδικός διαγράφει μια εγγραφή χρησιμοποιώντας το DeleteOne λειτουργία. Χρησιμοποιεί επίσης το αποτέλεσμα. Διαγραμμένος αριθμός ιδιότητα για την αποτροπή εκτέλεσης του κώδικα εάν η βάση δεδομένων είναι κενή ή το αναγνωριστικό αντικειμένου δεν είναι έγκυρο.
Δημιουργήστε το αρχείο API Runner
Τέλος, δημιουργήστε ένα main.go μέσα στον ριζικό κατάλογο του έργου σας. Η τελική δομή του έργου σας θα πρέπει να μοιάζει με αυτό:
Αυτό το αρχείο χειρίζεται την εκτέλεση του δρομολογητή για κάθε τελικό σημείο:
πακέτο κύριος
εισαγωγή (
διαδρομές "CRUD_API/διαδρομές"
"github.com/gin-gonic/gin"
)func κύριος(){
router := τζιν.Προκαθορισμένο()δρομολογητή. ΘΕΣΗ("/", διαδρομές. CreatePost)
// καλείται ως localhost: 3000/getOne/{id}
δρομολογητή. ΠΑΙΡΝΩ("getOne/:postId", διαδρομές. ReadOnePost)// καλείται ως localhost: 3000/εκσυγχρονίζω/{ταυτότητα}
δρομολογητή. ΒΑΖΩ("/update/:postId", διαδρομές. UpdatePost)// καλείται ως localhost: 3000/διαγράφω/{ταυτότητα}
δρομολογητή. ΔΙΑΓΡΑΦΩ("/διαγράφω/:postId", διαδρομές. DeletePost)
δρομολογητή. Τρέξιμο("localhost: 3000")
}
Αυτό το αρχείο είναι το κύριο πακέτο που εκτελεί άλλα αρχεία. Ξεκινά με την εισαγωγή των χειριστών διαδρομής. Επόμενο είναι το δρομολογητή μεταβλητός, α τζιν παράδειγμα που προκαλεί τις ενέργειες HTTP και καλεί κάθε τελικό σημείο με το όνομα της συνάρτησής του από το διαδρομές πακέτο.
Το έργο σας CRUD εκτελείται localhost: 3000. Για να εκτελέσετε τον διακομιστή και δοκιμάστε το CRUD API, εκτελέστε την ακόλουθη εντολή στον βασικό σας κατάλογο:
πηγαίνωτρέξιμοκύριος.πηγαίνω
Μετατρέψτε το Golang CRUD Project σας σε ένα προϊόν που μπορεί να χρησιμοποιηθεί
Δημιουργήσατε με επιτυχία ένα CRUD API με το Go. Συγχαρητήρια! Αν και αυτό είναι ένα μικρό έργο, έχετε δει τι χρειάζεται για την εκτέλεση κανονικών αιτημάτων HTTP στο Go.
Μπορείτε να γίνετε πιο δημιουργικοί επεκτείνοντας το σε μια πιο πρακτική εφαρμογή που προσφέρει αξία στους χρήστες. Η Go είναι μια κατάλληλη γλώσσα προγραμματισμού για μια σειρά περιπτώσεων χρήσης.