"Enter"a basıp içeriğe geçin

Go ile API Geliştirmeye Başlamak

Uzun bir süredir NodeJS ve Laravel kullanarak farklı platformlar için API geliştiriyorum. Artık farklı dilleride denemenin zamanı geldi diye düşündüm ve Go’ya ufak bir adım olması açısından basit bir API örneği ile öğrendiklerimi bu yazıda topluyorum.

Neden Go ?

Go’da “low-level” programlama dilide arasında yer alıyor. Buda bizlere Java’da veya C++’da elde ettiğimiz performansına benzer ancak en büyük farkı diğerlerinden daha basit vede bir çok önemli kütüphaneyi zaten içinde barındıran bir ortam sunuyor olması.

Performans konusunda bir çok araştırma yaptım. Go’nun tam anlamı ile bir canavar diyebiliriz :D. Python ile olan bir testi şurada mevcut. İncelemenizi öneririm.

Başlamadan önce

Bu yazı en azından daha önce API geliştirmiş ve Go’ya azda olsa aşina iseniz sizin için daha yararlı olacaktır. Ben genelde basit bir “GET” ve “POST” yapan bir uygulama geliştirerek giriş yapmayı tercih ediyorum. Başlangıçta ne kadar basit tutarsak o kadar iyi.

Proje ortamını ayarlama

Go’yu daha önce indirmediyseniz şu adresten indirebilirsiniz. Go ile proje geliştirirken goland veya vscode kullanabilirsiniz. İkisinide denedim. Goland bana daha başarılı geldi nedense syntax ve autocorrection bakımından daha az hata yapmanız üzerine tasarlanmış. Vscode’da bu kısımları pluginler ile çözebiliyorsunuz.

Basit proje mimarimiz şu şekilde:

  • controllers -> CRUD veya logiclerimizi yazdığımız controllerlar.
  • models -> Database modellerimizin bulunduğu klasör.
  • main.go -> Serverı başlatan programımız.

Server’ı ayarlama

Ben http frameworku olarak gin seçtim Hız testlerinde en iyi sonuçlar gindeydi, github sayfalarında detaylı testleri ve diğer frameworkleri bulabilirsiniz.

Proje ana dizinimize main.go adında bir dosya oluşturup ilk “Hello World” uygulamamızı yazdırarak başlayalım.

package main

import (
  "net/http"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  r.GET("/", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"data": "Hello World."})    
  })
  r.Run()
}

Gin bizlere burada aynı zamanda bir router sistemi sağlıyor.Eğer express veya flask kullandıysanız benzer yapılar ile karşılaşmışsınızdır. Ama isterseniz başka router kütüphaneleride kullanabiliyorsunuz gin bu konuda baya esnek.

Eğer localhost:8080’e giderseniz hello world yazısını gördüyseniz tebrikler go serverımız ayakta 🙂

Database kurulumu

API endpointlerimize geçmeden önce veritabanı modelimizi ve bağlantılarımızı tanımlayalım.

Öncelikle model -> user.go adında bir dosya oluşturalım.

package models

import (
	_ "github.com/jinzhu/gorm"
)

type User struct {
	ID	uint	`json:"id"	gorm:"primary_key"`
	Name	string 	`json:"name"`
	Surname	string 	`json:"surname"`
}

ORM yapısından yararlanmak için gorm kullandım. Bu sayede tablolalarımızında otomatik olarak oluşturulmasını sağlamış oluyoruz.

Not: Şuan için Gorm sadece sqlite, mysql, postgres, mssql destekliyor. (26 Mayıs 2020)

Daha sonra models -> setup.go adında bir dosya daha oluşturalım bu kısımda veritabanını bağlantımızı ekleyelim.

package models

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var DB *gorm.DB

func ConnectDatabase() {
	database, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/karaboga")
	if err != nil {
		fmt.Printf("Error connecting to DB: %s", err)
	}
	database.AutoMigrate(&User{})
	DB = database
}

gorm.Open methodu database bağlantısını yapmamızı sağlıyor. İlk parametre hangi türde bir veritabanı kullanıdınızı, ikinci parametre ise veritabanı bilgilerini (“username:password@tcp(host)/database-name”) gösteriyor.

database.AutoMigrate ise daha önce oluşturdumuz user modelini baz alarak şemamızı oluşturuyor.

Controller tanımlama

controllers -> users.go adın bir dosya oluşturalım.

Öncelikle tüm userları getiren bir requestimiz olduğunu düşünelim. Bunun için bize userları getiren ve geri json olarak geri döndüren bir fonksiyon yazmamız gerekiyor

package controllers

import (
	"go-api-example/models"
	"github.com/gin-gonic/gin"
	"net/http"
)

func GetUsers(c *gin.Context) {
	var users []models.User
	models.DB.Find(&users)
	c.JSON(http.StatusOK, gin.H{"data":users})
}

Peki bu kısımdan sonra route nasıl bağlarız direk ona geçip bir test edelim.

Route tanımlama

main.go dosyamıza geri dönelim. Daha önce yazdımız get routemıza benzer bir route oluşturup parametre olarak fonksiyonumuzu vermemiz yeterli.

package main

import (
	"go-api-example/controllers"
	"go-api-example/models"
	"net/http"
	_ "net/http"
	"github.com/gin-gonic/gin"

	)

func main() {
	r := gin.Default()
	models.ConnectDatabase()
	r.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"data": "Hello World."})
	})
	r.GET("/users",controllers.GetUsers)
	r.Run()
}

localhost:8080/users adresine gittimizde eğer veritabanına bir girdi eklemediyseniz boş bir array döndürecektir. Hemen post requestimizi oluşturup biraz data ekleyelim.

POST request tanımlama

Post request nasıl bir body alacağını type yazarak tanımlamanız gerekiyor. Bu sayede requestimize validationda tanımlamış oluyoruz. Typemizi controller içine yazıyoruz unutmayın.

type CreateUserInput struct {
	Name string `json:"name" binding:"required"`
	Surname string `json:"surname" binding:"required"`
}

Daha sonra asıl işi yapacak controllerımıza input olarak typemizi bind ediyoruz. Böylece validationdan geçemez ise error fırlatmasını sağlamış oluyoruz. Eğer yok ise eklenen veri bizlere json olarak geri döndürülüyor.

func CreateUser(c *gin.Context) {
	var input CreateUserInput
	if err := c.ShouldBindJSON(&input); err !=nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	user := models.User{Name: input.Name, Surname: input.Surname}
	models.DB.Create(&user)
	c.JSON(http.StatusOK,gin.H{"data":user})
}

son olarakda route olarak main.go dosyamıza şu satırı ekliyoruz.

r.POST("users",controllers.CreateUser)

Sonuç:

İlk başta syntax, typelar ve pointerlar karışık geldi açıkcası sonra bir fakat pratik yaptıkça alışmaya başladım. Ilerleyen zamanlarda cloud projelerimin hepsini Go’ya geçirmeyi planlıyorum eğlenceli görünüyor şuan benim açımdam 😀 . Bu şekilde bir başlangıç yaptım bende ilerliyorum şuan. Umarım benim gibi NodeJS ve Laravel’den gelenler için iyi bir özet olmuştur.

Delete, Update requestlerin yazılmasını sizlere bırakıyorum. Herhangi bir sorunuz olursa yorum kısmından belirtmekten lütfen çekinmeyin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir