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:
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önderilererteleme 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önderilererteleme 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.