Golang, birçok uygulamaya sahip, en çok ödeme yapan, talep gören programlama dillerinden biridir. Gin, Revel ve gorilla/mux gibi çerçevelerle eşleştirildiğinde Go ile kolayca bir API oluşturabilirsiniz.

Gin HTTP çerçevesini kullanarak Golang'da nasıl CRUD API oluşturacağınızı öğrenin.

İlk Kurulum ve Kurulum

Golang'ı kullanmaya başlayın Henüz yapmadıysanız, bilgisayarınıza yükleyerek.

Kurulduktan sonraki adım, makinenizde bir proje kök klasörü oluşturmak ve bu kök dizinde bir Go modülünü başlatmaktır.

Bunu yapmak için açın bir CLI, proje kök klasörünüze gidin ve çalıştırın:

mod init modül_adı git

Modül adınızı göreceksiniz (ör. CRUD_API) ve sürümünü açtığınızda go.mod dosya. Tüm özel paketler bu ana modülden gelecektir. Böylece, içe aktarılan herhangi bir özel paket şu şekli alır:

içe aktarmak(paket CRUD_API/paket-dizin-adı)

Ardından, CRUD API'sini oluşturmak için gerekli paketleri kurun. Bu durumda, kullanın cin gonik API uç noktalarını yönlendirmek için:

Git almak github.com/gin-gonic/gin

Şimdi verileri depolamak için MongoDB Sürücüsünü kurun:

instagram viewer
Git almak go.mongodb.org/mongo-driver/mongo

MongoDB'ye Git Nasıl Bağlanır

Golang'ı veritabanına bağlamak için tek ihtiyacınız olan MongoDB URI'niz. MongoDB Atlas'a yerel olarak bağlanıyorsanız, genellikle şöyle görünür:

Mongo_URL = "mongodb://127.0.0.1:27017"

Şimdi proje kök dizininizde yeni bir klasör oluşturun ve onu çağırın veritabanları. Bu klasörün içinde bir Go dosyası oluşturun ve adlandırın veritabanı.go.

Bu, veritabanı paketinizdir ve gerekli kitaplıkları içe aktararak başlar:

paket veri tabanı

içe aktarmak (
"bağlam"
"fmt"
"kayıt"
"zaman"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

işlev ConnectDB() * mongo. Müşteri {
Mongo_URL := "mongodb://127.0.0.1:27017"
istemci, hata := mongo. NewClient (seçenekler. Client().ApplyURI(Mongo_URL))

eğer hata != nil {
kayıt.Ölümcül(hata)
}

ctx, iptal := bağlam. WithTimeout (bağlam. Arkaplan(), 10 * zaman. İkinci)
hata = müşteri. Bağlan (ctx)
erteleme iptal()

eğer hata != nil {
kayıt.Ölümcül(hata)
}

fmt. Yazdır("mongoDB'ye bağlı")
dönüş müşteri
}

Veritabanı bağlantı dizesi gibi ortam değişkenlerini bir .env dosya dotenv paketini kullanma. Bu, kodunuzu daha taşınabilir hale getirir ve bir MongoDB bulut kümesi örneği, örneğin.

bu ConnectDB işlevi bir bağlantı kurar ve yeni bir MongoDB İstemci nesnesi döndürür.

Veritabanı Koleksiyonu Oluştur

MongoDB, verileri, temel alınan veritabanı verilerine bir arabirim sağlayan Koleksiyonlarda depolar.

Koleksiyon getirme işlevini işlemek için yeni bir klasör oluşturarak başlayın, Toplamak, proje kökünüzde. Şimdi yeni bir Go dosyası oluşturun, getCollection.go, bu koleksiyonu veritabanından alır:

paket toplama

içe aktarmak (
"go.mongodb.org/mongo-driver/mongo"
)

işlevGetCollection(müşteri *mongo.Müşteri, koleksiyonAdısicim) *mongo.Toplamak {
koleksiyon := müşteri. Veri tabanı("myGoappDB").Toplamak("Gönderiler")
dönüş Toplamak
}

Bu işlev, Koleksiyonu MongoDB veritabanından alır. Veritabanı adı, bu durumda, myGoappDB, ile birlikte Gönderiler koleksiyonu olarak.

Veritabanı Modelini Oluşturun

Kök dizininizin içinde yeni bir klasör oluşturun ve onu arayın model. Bu klasör, veritabanı modelinizi işler.

Bu klasörün içinde yeni bir Go dosyası oluşturun ve onu arayın model.go. Bu durumda modeliniz, başlığına sahip bir blog yazısıdır:

paket model

içe aktarmak (
"go.mongodb.org/mongo-driver/bson/primitive"
)

tip Post yapısı {
İDilkel.Nesne Kimliği
Başlık dizesi
makale dizisi
}

Go ile bir CRUD API Oluşturma

Sırada CRUD API oluşturma var. Bu bölüme başlamak için, uç noktalarınızı işlemek için proje kök dizininizde yeni bir klasör oluşturun. Bunu aramak rotalar.

Her eylem için bu klasörde ayrı bir Go dosyası oluşturun. Örneğin, onları adlandırabilirsiniz oluştur. git, oku. git, update.go, ve sil.go. Bu işleyicileri rotalar paket.

Go'da POST Bitiş Noktası Nasıl Oluşturulur

Veritabanına veri yazmak için POST uç noktasını tanımlayarak başlayın.

İçeri rotalar/create.go, şunları ekleyin:

paket rotalar

içe aktarmak (
toplama "CRUD_API/Koleksiyon"
veri tabanı "CRUD_API/veritabanları"
model "CRUD_API/modeli"
"bağlam"
"kayıt"
"net/http"
"zaman"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)

işlev Gönderi Oluştur(c * cin. Bağlam){
var DB = veritabanı. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Gönderiler")
ctx, iptal := bağlam. WithTimeout (bağlam. Arkaplan(), 10*zaman. İkinci)
gönderi := yeni(model. Gönderiler)
erteleme iptal()

eğer hata := c. BindJSON(&İleti); hata != nil {
c. JSON(http. StatusBadRequest, cin. H{"İleti": hata})
kayıt.Ölümcül(hata)
dönüş
}

postPayload := model. Gönderiler{
İD: ilkel.YeniNesneKimliği(),
Başlık: İleti.Başlık,
Madde: İleti.Madde,
}

sonuç, err := postCollection. InsertOne (ctx, postPayload)

eğer hata != nil {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": hata})
dönüş
}

c. JSON(http. Durum Oluşturuldu, cin. H{"İleti": "Başarıyla gönderildi", "Veri": harita[dize]arayüz{}{"veri": sonuç}})
}

Bu kod, projenin özel modüllerini içe aktararak başlar. Daha sonra dahil olmak üzere üçüncü taraf paketleri içe aktarır. Cin ve MongoDB Sürücüsü.

Daha öte, koleksiyon sonrası veritabanı koleksiyonunu tutar. Özellikle, c. BindJSON("gönder") her model alanını şu şekilde çağıran bir JSONified model örneğidir: yük sonrası; bu veritabanına giriyor.

GET Uç Noktası Nasıl Oluşturulur

GET uç noktası, rotalar/read.go, benzersiz kimliği aracılığıyla veritabanından tek bir belge okur. Ayrıca, özel ve üçüncü taraf paketleri içe aktararak başlar:

paket rotalar

içe aktarmak (
toplama "CRUD_API/Koleksiyon"
veri tabanı "CRUD_API/veritabanları"
model "CRUD_API/modeli"
"bağlam"
"net/http"
"zaman"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

işlev OkuBir Gönderi(c * cin. Bağlam){
ctx, iptal := bağlam. WithTimeout (bağlam. Arkaplan(), 10*zaman. İkinci)
var DB = veritabanı. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Gönderiler")

postId := c. parametre("posta kimliği")
var sonuç modeli. Gönderiler

erteleme iptal()

objId, _ := ilkel. ObjectIDFromHex (postId)

hata := postCollection. FindOne (ctx, bson. M{"İD": objId}).Kodunu çöz(&sonuç)

res := harita[dize]arayüz{}{"veri": sonuç}

eğer hata != nil {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": hata})
dönüş
}

c. JSON(http. Durum Oluşturuldu, cin. H{"İleti": "başarı!", "Veri": res})
}

bu posta kimliği değişken bir parametre bildirimidir. Bir belgenin nesne kimliğini şu şekilde alır: nesne.

Yine de, sonuç daha sonra döndürülen belgeyi şu şekilde tutan veritabanı modelinin bir örneğidir. res.

PUT Uç Noktası Nasıl Oluşturulur

PUT işleyicisi, rotalar/güncelleme.go, POST işleyicisine benzer. Bu sefer, mevcut bir gönderiyi benzersiz nesne kimliğiyle günceller:

paket rotalar

içe aktarmak (
toplama "CRUD_API/Koleksiyon"
veri tabanı "CRUD_API/veritabanları"
model "CRUD_API/modeli"
"bağlam"
"net/http"
"zaman"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

işlev GüncellePost(c * cin. Bağlam){
ctx, iptal := bağlam. WithTimeout (bağlam. Arkaplan(), 10 * zaman. İkinci)
var DB = veritabanı. ConnectDB()
var postCollection = getcollection. GetCollection (DB, "Gönderiler")

postId := c. parametre("posta kimliği")
var posta modeli. Gönderiler

erteleme iptal()

objId, _ := ilkel. ObjectIDFromHex (postId)

eğer hata := c. BindJSON(&İleti); hata != nil {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": hata})
dönüş
}

düzenlendi := bson. M{"Başlık": İleti. Başlık, "makale": İleti. Madde}

sonuç, err := postCollection. UpdateOne (ctx, bson. M{"İD": nesne}, bson. M{"$ayar": düzenlendi})

res := harita[dize]arayüz{}{"veri": sonuç}

eğer hata != nil {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": hata})
dönüş
}

eğer sonuç. MatchedCount < 1 {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": "Veri yok'yok"})
dönüş
}

c. JSON(http. Durum Oluşturuldu, cin. H{"İleti": "veriler başarıyla güncellendi!", "Veri": res})
}

Model örneğinin bir JSON biçimi (İleti) veritabanından her model alanını çağırır. Sonuç değişkeni MongoDB'yi kullanır $ayar nesne kimliği tarafından çağrılan gerekli bir belgeyi güncellemek için operatör.

bu sonuç. MatchedCount koşul, veritabanında kayıt yoksa veya geçirilen kimlik geçersizse kodun çalışmasını engeller.

DELETE Uç Noktası Oluşturma

DELETE uç noktası, sil.go, bir URL parametresi olarak iletilen nesne kimliğine dayalı olarak bir belgeyi kaldırır:

paket rotalar

içe aktarmak (
toplama "CRUD_API/Koleksiyon"
veri tabanı "CRUD_API/veritabanları"
"bağlam"
"net/http"
"zaman"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

işlev Sil Gönderi(c * cin. Bağlam){
ctx, iptal := bağlam. WithTimeout (bağlam. Arkaplan(), 10*zaman. İkinci)
var DB = veritabanı. ConnectDB()
postId := c. parametre("posta kimliği")

var postCollection = getcollection. GetCollection (DB, "Gönderiler")
erteleme iptal()
objId, _ := ilkel. ObjectIDFromHex (postId)
sonuç, err := postCollection. DeleteOne (ctx, bson. M{"İD": nesne})
res := harita[dize]arayüz{}{"veri": sonuç}

eğer hata != nil {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": hata})
dönüş
}

eğer sonuç. SilinmişSayı < 1 {
c. JSON(http. StatusInternalServerError, cin. H{"İleti": "Silinecek veri yok"})
dönüş
}

c. JSON(http. Durum Oluşturuldu, cin. H{"İleti": "Makale başarıyla silindi", "Veri": res})
}

Bu kod, kullanarak bir kaydı siler. Birini Sil işlev. Ayrıca şunları kullanır: sonuç. SilinmişSayı veritabanı boşsa veya nesne kimliği geçersizse kodun çalışmasını engelleyen özellik.

API Runner Dosyasını Oluşturun

Son olarak, bir ana.go proje kök dizininizin içinde. Nihai proje yapınız şöyle görünmelidir:

Bu dosya, her uç nokta için yönlendirici yürütmesini işler:

paket ana

içe aktarmak (
rotalar "CRUD_API/rotalar"
"github.com/gin-gonic/gin"
)

işlev ana(){
yönlendirici := cin.Varsayılan()

yönlendirici. İLETİ("/", rotalar. Gönderi Oluştur)

// localhost olarak adlandırılır: 3000/getOne/{id}
yönlendirici. ALMAK("getOne/:postId", rotalar. OkuBir Gönderi)

// localhost olarak adlandırılır: 3000/Güncelleme/{İD}
yönlendirici. KOY("/update/:postId", rotalar. Güncelleme Gönderi)

// localhost olarak adlandırılır: 3000/silmek/{İD}
yönlendirici. SİLMEK("/silmek/:postId", rotalar. Mesajı Sil)

yönlendirici. Koşmak("yerel ana bilgisayar: 3000")
}

Bu dosya, diğer dosyaları çalıştıran ana pakettir. Rota işleyicilerini içe aktararak başlar. Sonraki yönlendirici değişken, bir cin HTTP eylemlerini çağrıştıran ve her uç noktayı rotalar paket.

CRUD projeniz devam ediyor yerel ana bilgisayar: 3000. Sunucuyu çalıştırmak ve CRUD API'sini test edin, temel dizininizde aşağıdaki komutu çalıştırın:

Gitkoşmakana.Git

Golang CRUD Projenizi Kullanılabilir Bir Ürüne Dönüştürün

Go ile başarıyla bir CRUD API oluşturdunuz; Tebrikler! Bu küçük bir proje olsa da, Go'da normal HTTP isteklerini yürütmek için ne gerektiğini gördünüz.

Bunu, kullanıcılara değer sağlayan daha pratik bir uygulamaya genişleterek daha yaratıcı olabilirsiniz. Go, çeşitli kullanım durumları için uygun bir programlama dilidir.