Golang je eden najbolje plačanih in zahtevanih programskih jezikov s številnimi aplikacijami. V kombinaciji z ogrodji, kot so Gin, Revel in gorilla/mux, lahko preprosto ustvarite API z Go.

Naučite se ustvariti CRUD API v Golangu z uporabo ogrodja Gin HTTP.

Začetna nastavitev in namestitev

Začnite z Golangom tako, da ga namestite v svoj računalnik, če tega še niste storili.

Ko je nameščen, je naslednji korak ustvariti korensko mapo projekta na vašem računalniku in inicializirati modul Go v tem korenskem imeniku.

Če želite to narediti, odprite CLI, se pomaknite do korenske mape projekta in zaženite:

go mod init ime_modula

Videli boste ime svojega modula (npr. CRUD_API) in njegovo različico, ko odprete go.mod mapa. Vsi paketi po meri bodo izhajali iz tega nadrejenega modula. Vsak uvožen paket po meri ima torej obliko:

uvoz(paket CRUD_API/paket-ime-imenika)

Nato namestite pakete, potrebne za ustvarjanje API-ja CRUD. V tem primeru uporabite Gin Gonic za usmerjanje končnih točk API-ja:

pojdi dobiti github.com/gin-gonic/gin
instagram viewer

Zdaj namestite gonilnik MongoDB za shranjevanje podatkov:

pojdi dobiti go.mongodb.org/mongo-driver/mongo

Kako se povezati Pojdite na MongoDB

Vse, kar potrebujete, je vaš MongoDB URI za povezavo Golanga z bazo podatkov. Če se lokalno povezujete z MongoDB Atlas, je običajno videti takole:

Mongo_URL = "mongodb://127.0.0.1:27017"

Zdaj ustvarite novo mapo v korenskem imeniku projekta in jo pokličite baze podatkov. V tej mapi ustvarite datoteko Go in jo poimenujte baza podatkov.go.

To je vaš paket baze podatkov in začne se z uvozom zahtevanih knjižnic:

paket zbirka podatkov

uvoz (
"kontekstu"
"fmt"
"dnevnik"
"čas"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

funk ConnectDB() *mongo. Stranka {
Mongo_URL := "mongodb://127.0.0.1:27017"
stranka, napaka := mongo. NewClient (možnosti. Client().ApplyURI(Mongo_URL))

if err != nil {
dnevnik.Usodno(napaka)
}

ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 10 * čas. drugič)
napaka = stranka. Poveži (ctx)
odloži prekliči()

if err != nil {
dnevnik.Usodno(napaka)
}

fmt. Println("Povezan z mongoDB")
vrnitev stranka
}

Najboljša praksa je, da spremenljivke okolja, kot je povezovalni niz baze podatkov, skrijete v a .env mapa z uporabo paketa dotenv. Zaradi tega je vaša koda bolj prenosljiva in je uporabna pri uporabi a Primerek gruče v oblaku MongoDB, na primer.

The ConnectDB funkcija vzpostavi povezavo in vrne nov objekt MongoDB Client.

Ustvari zbirko podatkovnih baz

MongoDB shranjuje podatke v zbirke, ki zagotavljajo vmesnik do osnovnih podatkov baze podatkov.

Za upravljanje funkcije pridobivanja zbirke začnite z ustvarjanjem nove mape, Zbirka, v korenu vašega projekta. Zdaj ustvarite novo datoteko Go, getCollection.go, ki pridobi zbirko iz baze podatkov:

paket getcollection

uvoz (
"go.mongodb.org/mongo-driver/mongo"
)

funkGetCollection(stranka *mongo.Stranka, collectionNamevrvica) *mongo.Zbirka {
zbirka := stranka. Baza podatkov ("myGoappDB").Zbirka("Objave")
vrnitev zbirka
}

Ta funkcija pridobi zbirko iz baze podatkov MongoDB. Ime baze podatkov je v tem primeru myGoappDB, z Objave kot svojo zbirko.

Ustvarite model baze podatkov

Ustvarite novo mapo v korenskem imeniku in jo pokličite model. Ta mapa obravnava vaš model baze podatkov.

V tej mapi ustvarite novo datoteko Go in jo pokličite model.go. Vaš model je v tem primeru objava v spletnem dnevniku z naslovom:

paket model

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

vrsta Objavi strukturo {
IDprimitiven.ObjectID
Naslovni niz
Niz člena
}

Ustvarjanje API-ja CRUD z Go

Sledi ustvarjanje API-ja CRUD. Če želite začeti s tem razdelkom, ustvarite novo mapo znotraj korenskega imenika vašega projekta za upravljanje končnih točk. Pokliči poti.

Za vsako dejanje v tej mapi ustvarite ločeno datoteko Go. Lahko jih na primer poimenujete create.go, preberi.pojdi, posodobitev.go, in delete.go. Te upravljalnike boste izvozili kot poti paket.

Kako ustvariti končno točko POST v Go

Začnite z definiranjem končne točke POST za zapisovanje podatkov v bazo podatkov.

V notranjosti routes/create.go, dodajte naslednje:

paket poti

uvoz (
getcollection "CRUD_API/Zbirka"
zbirka podatkov "CRUD_API/baze podatkov"
model "CRUD_API/model"
"kontekstu"
"dnevnik"
"net/http"
"čas"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)

funk CreatePost(c *gin. kontekst){
var DB = baza podatkov. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Objave")
ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 10*čas. drugič)
objava := novo(model. objave)
odloži prekliči()

če je napaka := c. BindJSON(&post); napaka != nič {
c. JSON(http. StatusBadRequest, gin. H{"sporočilo": napaka})
dnevnik.Usodno(napaka)
vrnitev
}

postPayload := model. Objave{
Id: primitiven.NewObjectID(),
Naslov: post.Naslov,
Članek: post.Članek,
}

rezultat, napaka := postCollection. InsertOne (ctx, postPayload)

if err != nil {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": napaka})
vrnitev
}

c. JSON(http. Stanje ustvarjeno, gin. H{"sporočilo": "Uspešno objavljeno", "podatki": zemljevid[string]vmesnik{}{"podatke": rezultat}})
}

Ta koda se začne z uvozom modulov po meri projekta. Nato uvozi pakete tretjih oseb, vključno z gin in Gonilnik MongoDB.

Nadalje, postCollection hrani zbirko podatkovnih baz. Zlasti c. BindJSON("objava") je primerek modela JSON, ki kliče vsako polje modela kot postPayload; to gre v bazo podatkov.

Kako ustvariti končno točko GET

Končna točka GET, v routes/read.go, prebere en sam dokument iz baze podatkov prek njegovega edinstvenega ID-ja. Začne se tudi z uvozom paketov po meri in paketov tretjih oseb:

paket poti

uvoz (
getcollection "CRUD_API/Zbirka"
zbirka podatkov "CRUD_API/baze podatkov"
model "CRUD_API/model"
"kontekstu"
"net/http"
"čas"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

funk ReadOnePost(c *gin. kontekst){
ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 10*čas. drugič)
var DB = baza podatkov. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Objave")

postId := c. Param("postId")
var model rezultata. Objave

odloži prekliči()

objId, _ := primitiven. ObjectIDFromHex (postId)

napaka := postCollection. FindOne (ctx, bson. M{"id": objId}).Decode(&rezultat)

res := zemljevid[niz]vmesnik{}{"podatki": rezultat}

if err != nil {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": napaka})
vrnitev
}

c. JSON(http. Stanje ustvarjeno, gin. H{"sporočilo": "uspeh!", "podatki":res})
}

The postId spremenljivka je deklaracija parametra. ID predmeta dokumenta dobi kot objId.

vendar rezultat je primerek modela baze podatkov, ki pozneje hrani vrnjeni dokument kot res.

Kako ustvariti končno točko PUT

Obravnavalnik PUT, v routes/update.go, je podoben upravljalniku POST. Tokrat posodobi obstoječo objavo z edinstvenim ID-jem objekta:

paket poti

uvoz (
getcollection "CRUD_API/Zbirka"
zbirka podatkov "CRUD_API/baze podatkov"
model "CRUD_API/model"
"kontekstu"
"net/http"
"čas"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

funk UpdatePost(c *gin. kontekst){
ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 10 * čas. drugič)
var DB = baza podatkov. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Objave")

postId := c. Param("postId")
var post model. Objave

odloži prekliči()

objId, _ := primitiven. ObjectIDFromHex (postId)

če je napaka := c. BindJSON(&post); napaka != nič {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": napaka})
vrnitev
}

urejeno := bson. M{"naslov": post. Naslov, "Članek": post. Članek}

rezultat, napaka := postCollection. UpdateOne (ctx, bson. M{"id": objId}, bson. M{"$set": urejeno})

res := zemljevid[niz]vmesnik{}{"podatki": rezultat}

if err != nil {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": napaka})
vrnitev
}

če rezultat. MatchedCount < 1 {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": "Podatki ne'ne obstaja"})
vrnitev
}

c. JSON(http. Stanje ustvarjeno, gin. H{"sporočilo": "podatki so bili uspešno posodobljeni!", "podatki":res})
}

Format JSON primerka modela (post) pokliče vsako polje modela iz baze podatkov. Spremenljivka rezultata uporablja MongoDB $set operater za posodobitev zahtevanega dokumenta, ki ga kliče njegov ID objekta.

The rezultat. MatchedCount pogoj prepreči izvajanje kode, če v bazi podatkov ni nobenega zapisa ali če je posredovani ID neveljaven.

Ustvarjanje končne točke DELETE

Končna točka DELETE, v delete.go, odstrani dokument na podlagi ID-ja predmeta, posredovanega kot parameter URL:

paket poti

uvoz (
getcollection "CRUD_API/Zbirka"
zbirka podatkov "CRUD_API/baze podatkov"
"kontekstu"
"net/http"
"čas"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

funk DeletePost(c *gin. kontekst){
ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 10*čas. drugič)
var DB = baza podatkov. ConnectDB()
postId := c. Param("postId")

var postCollection = getcollection. GetCollection (DB, "Objave")
odloži prekliči()
objId, _ := primitiven. ObjectIDFromHex (postId)
rezultat, napaka := postCollection. DeleteOne (ctx, bson. M{"id": objId})
res := zemljevid[niz]vmesnik{}{"podatki": rezultat}

if err != nil {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": napaka})
vrnitev
}

če rezultat. DeletedCount < 1 {
c. JSON(http. StatusInternalServerError, gin. H{"sporočilo": "Ni podatkov za brisanje"})
vrnitev
}

c. JSON(http. Stanje ustvarjeno, gin. H{"sporočilo": "Članek uspešno izbrisan", "podatki":res})
}

Ta koda izbriše zapis z uporabo DeleteOne funkcijo. Uporablja tudi rezultat. DeletedCount lastnost, ki preprečuje izvajanje kode, če je baza podatkov prazna ali je ID objekta neveljaven.

Ustvarite datoteko API Runner

Končno ustvarite a main.go znotraj korenskega imenika vašega projekta. Vaša končna struktura projekta bi morala izgledati takole:

Ta datoteka obravnava izvajanje usmerjevalnika za vsako končno točko:

paket glavni

uvoz (
poti "CRUD_API/routes"
"github.com/gin-gonic/gin"
)

funk glavni(){
usmerjevalnik := gin.Privzeto()

usmerjevalnik. OBJAVI("/", poti. CreatePost)

// imenovan kot lokalni gostitelj: 3000/getOne/{id}
usmerjevalnik. GET("getOne/:postId", poti. ReadOnePost)

// imenovan kot lokalni gostitelj: 3000/nadgradnja/{id}
usmerjevalnik. PUT("/update/:postId", poti. UpdatePost)

// imenovan kot lokalni gostitelj: 3000/izbrisati/{id}
usmerjevalnik. DELETE("/izbrisati/:postId", poti. Izbriši objavo)

usmerjevalnik. Zaženi ("lokalni gostitelj: 3000")
}

Ta datoteka je glavni paket, ki poganja druge datoteke. Začne se z uvozom upravljavcev poti. Naslednja je usmerjevalnik spremenljivka, a gin primerek, ki prikliče dejanja HTTP in pokliče vsako končno točko z imenom funkcije iz poti paket.

Vaš projekt CRUD teče naprej lokalni gostitelj: 3000. Za zagon strežnika in preizkusite CRUD API, zaženite naslednji ukaz v svojem osnovnem imeniku:

pojditečiglavni.pojdi

Spremenite svoj projekt Golang CRUD v uporaben izdelek

Uspešno ste ustvarili CRUD API z Go; čestitke! Čeprav je to manjši projekt, ste videli, kaj je potrebno za izvajanje običajnih zahtev HTTP v Go.

Lahko postanete bolj ustvarjalni, če to razširite v bolj praktično aplikacijo, ki uporabnikom prinaša vrednost. Go je primeren programski jezik za vrsto primerov uporabe.