Go ile Web Api Uygulaması

Herkese merhaba, bu makalede Go programlama dili ile örnek bir web api projesi geliştireceğiz fakat bundan önce Go hakkında kısa bilgi vermekte yarar var çünkü nispeten yeni bir dil olmasına rağmen alanında daha eski olan Asp.Net, NodeJs, Java, Php gibi diğer dil ve framework’lerden ne gibi farkları olduğu ve neden bu kadar kısa sürede popüler olduğunu anlamak hangi durumlarda bu dili tercih etmemiz gerektiğine karar vermek konusunda önem arz ediyor.

Go programlama dili ilk olarak Google mühendisleri Robert Griesemer, Rob Pike, ve Ken Thompson tarafından 2007 yılında deneysel olarak geliştirilmeye başlanmıştır. Projenin amacı sistem programlamada C/C++ dillerinin iyi taraflarını da içeren ancak daha öz, temiz sözdizimli ve daha performanslı alternatif bir dil oluşturmaktır. Bu üç tasarımcı bir röportajlarında bu yeni dili yapmalarının motivasyonu olarak C++’daki karmaşıklığı beğenmediklerini söylemişlerdir. Bu sebepten dolayı 25 anahtar kelimeyle diğer dillere nazaran daha az karmaşıklığa sahiptir ancak bunun yanında Concurrancy konusunda Goroutine adında kendine özel mekanızmasıyla eşzamanlı programlamayı oldukça kolaylaştırmıştır. Garbage collactor’a sahip statik bir dildir fakat Go içerdiği özelliklerle daha çok dinamik dillere benzer. Hızlı derleme süresine ve kenine ait uzak paket yöneticisine sahiptir. 2012 yılında Go 1.0 yayınlamış ve bu yazının tarihi itibariyle 1.18 sürümüne ulaşmıştır. Go’nun kullanıldığı başarılı projelere buradan bakabilirsiniz. Go ile ilgili bilinmesi gerek en önemli konulardan birisi bu dilin object oriented bir dil olmamasıdır yani Go içerisinde Class benzeri inheritance kavramına karşılık gelen bir yapı yoktur. Interface ve new() hatta 1.18 versiyonunda gelen Generic gibi yapılar vardır ancak bunlar tam olarak C# gibi dillerdeki OOP kurallarına karşılık gelmez

Bu makalenin konusu olan projede Gofiber, Gorm ve MsSqlServer kullanılarak basit bir web api örneği geliştirilmiştir, Projenin Github reposuna buradan ulaşabilirsiniz. Öncelikler şunu söylemek gerekir ki Go ile kendi Standard Library‘sinde http, database ve daha bir çok yerleşik kütüphane ile harici bir kütüphaneye ihtiyaç duymadan web projesi geliştirebilirsiniz ancak açık kaynak bir dil olduğundan zaman içerisinde kullanıldıkça farklı ihtiyaçlara yönelik kütüphaneler geliştirilmiştir. Örneğin, web isteklerini handle etmek için Gin, Gorilla/Mux, Veritabanı işlemlerini ORM olarak gerçekleştirmek için Gorm gibi kütüphaneler kullanabilirsiniz.

Projenin klasör yapısını yanda görebilirsiniz, standart bir MVC yapısına benzer bir yapı ile geliştirdim, Gelen requestler ilk önce router tarafından karşılanır ve bunu handle eden controller’a yönlendirilir, controller ise service üzerinden database işlemleri yapar ve geriye bir entity döndürür bu ise Json olarak kullanıcıya geri döner, Bunun yanında authorization, caching, crypto gibi işlemler için middleware eklenebilir, proje genelinde ihtiyaç duyulan ortak görevler için utils klasörü altına fonksiyonlar eklenebilir. Gofiber için daha detaylı bilgilere buradan ulaşabilirsiniz

İlk önce paket yönetimini aktif etmek için aşağıdaki komutu çalıştırın, verdiğiniz parametre module adı olacaktır

go mod init github.com/tyetis/goapiexample

Uygulamanın giriş noktası olan main.go dosyası proje konfigürasyonlarını root folder’daki env dosyasından yükler daha sonra bir server create eder.

Main.go

Server.go dosyası bir Gofiber instance’ı alır ve route’ları bağlayarak belirtilen port’tan Listen eder

Server.go

Routes.go dosyası service ve controller’ların instance’sını oluşturarak request’leri bağlar. Burada dikkat etmeniz gereken nokta, config ve database instance’ının bir kere oluşturulur ve uygulamanın ömrü boyunca kullanılır. Gorm sizin için database contextini yönetir, ihtiyaç dahilinde bir connection havuzu oluşturur ve bağlantı yönetimini bunun üzerinden işler. UserRoutes metodu database instance’ı ile bir UserService oluşturur ve bunu UserController’a vererek yeni bir instance alır, bunun Index, Create gibi actionlarını route’lara handle eder.

Routes.go

UserController.go içerisindeki Index metodu router sayesinde bir Gofiber context’ini parametre alır, bunun içerisinden url içerisindeki parametreleri ve querystring verisine, request içerisinden header, authorization gibi verilere ulaşabilirsiniz. Bu örnekte, Index action’ı içinde requestten paging ve filter verilerini alıp bunu UserService’in GetAll metoduna iletiyoruz.

UserService.go içerisinde database’e erişip verilen paging ve filter parametreleri ile user tablosunu sorguluyoruz, dönen sonucu PaginationResult isminde bir struct’a aktarıyoruz. UserService struct’ı için IUserService interface’i oluşturup uygulama içerisinde OOP benzeri bir standart kuruyoruz. Create, Update, Delete metotlarını bu yazıda boş bırakıyorum. Gorm ile querying işlemleri için buradan detaylı bilgi alabilirsiniz.

Uygulamayı çalıştırmak için öncelikle env dosyasındaki konfigurasyonu kendi database bilgilerinize göre güncelleyin daha sonra projenin root folderında açtığınız terminalde aşağıdaki komutu girin

go run main.go

Herşey yolunda gitmiş ise “http://localhost:3000/users” adresine gittiğinizde veritabanınızdaki veriye göre aşağıdaki bir JSON sonucu göreceksiniz

{
   "Data":[
      {
         "Id":1,
         "Name":"Ali",
         "Email":"ali@email.com",
         "Password":"123",
         "CreateDate":"2022-12-03T00:00:00Z",
         "Orders":null
      }
   ],
   "Total":1,
   "PerPage":10,
   "CurrentPage":0
}

Bu makalenin kapsamı şimdilik bu kadar ileriki serilerde Go ile daha detaylı konulara giriş yapmayı düşünüyorum. Umarım faydalı olmuştur. Projenin Github reposu https://github.com/tyetis/GoWebApi

Mustafa Tayyip Yetiş
Senior Software Developer

5.0 Ort. (100% puan) - 1 oy

Leave a Reply

Your email address will not be published. Required fields are marked *