Giriş
Go, genellikle Golang olarak adlandırılır ve yüksek performanslı arka uç hizmetleri oluşturmak için hızla tercih edilen bir seçenek haline gelmiştir. Eşzamanlılık modeli, statik yazım ve olağanüstü yürütme hızı, onu modern mikroservis mimarileri için ideal bir aday yapar. Gin veya Echo gibi çerçeveler kolaylık sunsa da, Go'nun standart kütüphanesini kullanarak REST API'leri oluşturma becerisi, dilin temel mekaniklerini kavramak için hayati önem taşır. Bu kılavuz, üçüncü parti araçlara geçmeden önce sağlam bir temel sağlayarak, yalnızca standart kütüphaneyi kullanarak temel ve işlevsel bir REST API'si oluşturmanıza rehberlik eder.
Proje Yapısının Kurulması
Kod yazmadan önce, Go modülünüzü başlatın. Terminalinizi açın ve proje dizininizde aşağıdaki komutu çalıştırın:
go mod init my-rest-api
Bu komut, projenizin bağımlılıklarını yöneten bir go.mod dosyası oluşturur. Bu eğitim için yalnızca Go'nun yerleşik net/http ve encoding/json paketlerine güveneceğiz.
Veri Yapılarının Tanımlanması
Basit bir kaynak tanımlayarak başlayalım: bir "Görev". Bu veriyi temsil etmek için bir yapı (struct) kullanacağız. `json` etiketleri, HTTP istekleri ve yanıtları arasında JSON verilerini dönüştürmek (marshaling/unmarshaling) için gereklidir.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type Task struct {
ID string `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
HTTP İşleyicilerinin Uygulanması
Go'nun net/http paketi HandlerFunc arayüzünü kullanır. Bir işleyici, imzası func(http.ResponseWriter, *http.Request) olan basit bir işlevdir. Tüm görevleri listeleyen ve yeni bir tane oluşturan işleyiciler uygulayalım.
Liste İşleyicisi
Bu işleyici, küresel bir görev dilimini okur ve bunu bir JSON yanıtına dönüştürür. İstemcilerin yükü nasıl yorumlaması gerektiğini bilmesi için Content-Type başlığını doğru bir şekilde ayarlamak önemlidir.
var tasks []Task
func listTasks(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(tasks)
}
Oluşturma İşleyicisi
Bu işleyici POST isteklerini dinler. Gelen JSON gövdesini yeni bir Task yapısına çözer, bunu dilimimize ekler ve oluşturulan nesneyi 201 Created durum koduyla döndürür.
func createTask(w http.ResponseWriter, r *http.Request) {
var newTask Task
// İstekten JSON gövdesini çöz
err := json.NewDecoder(r.Body).Decode(&newTask)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// Buraya ID mantığını ekleyin (örneğin, uuid paketi kullanımı)
newTask.ID = "1"
tasks = append(tasks, newTask)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(newTask)
}
Yönlendirme ve Sunucu Yapılandırması
İşleyicilerimiz tanımlandığına göre, bunları belirli URL yollarına eşlememiz gerekiyor. Go'da, daha karmaşık yönlendirme için http.HandleFunc veya http.NewServeMux kullanırız.
func main() {
// Görev dilimini başlat
tasks = []Task{
{ID: "1", Title: "Go Öğren", Done: false},
}
// Yolları kaydet
http.HandleFunc("/tasks", listTasks)
http.HandleFunc("/tasks/create", createTask)
// Sunucuyu 8080 portunda başlat
log.Println("Sunucu :8080 portunda başlatılıyor")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
Sonuç
Go'nun standart kütüphanesiyle REST API'leri oluşturmak basit ve güçlüdür. net/http ve encoding/json'den yararlanarak, büyük çerçevelerin getirdiği ek yük olmadan sunucunuz üzerinde ince granüler kontrol elde edersiniz. Bu örnek temel olsa da, herhangi bir Go web uygulamasına uygulanan JSON dönüştürme, durum kodları ve istek işleme gibi temel kavramları gösterir. Üretim uygulamaları için günlük kaydı, kimlik doğrulama ve CORS için ara yazılım eklemeyi veya daha karmaşık yönlendirme ihtiyaçları için Chi veya Gin gibi bir yönlendiriciye geçmeyi düşünün. İyi kodlamalar!