Go Routing 101: net/http ile Rotaları İşleme ve Gruplandırma
Go’nun güçlü web geliştirme yeteneklerinin kalbinde, uygulamanızın farklı uç noktalarına istekleri yönlendirmenizi sağlayan yerleşik bir yönlendirme sistemi olan net/http paketi bulunur. Bu makalede, Go’nun net/http paketini kullanarak rotaları nasıl işleyebileceğinizi ve gruplandırabileceğinizi ele alacağız. Ayrıca, temel yönlendirme kavramlarını, farklı yöntemleri ve performans optimizasyonlarını keşfedeceğiz.
Temel Yönlendirme
En basit haliyle, Go’da bir rota, belirli bir URL desenine karşılık gelen bir işlevdir. Bir istek belirli bir URL’ye geldiğinde, Go o URL desenine uyan rota işlevini çağırır.
Örneğin, ana sayfamızın “/ ” URL’sine karşılık gelen basit bir rota tanımlayalım.
“`go
package main
import (
“fmt”
“net/http”
)
func main() {
http.HandleFunc(“/”, homeHandler)
http.ListenAndServe(“:8080”, nil)
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Merhaba, Dünya!”)
}
“`
Bu kod parçasında, `http.HandleFunc()` fonksiyonu, “/ ” URL desenine “homeHandler” fonksiyonunu eşler. “homeHandler” fonksiyonu, ana sayfa talebine karşılık gelen bir yanıt gövdesi oluşturan bir HTTP yanıt yazıcı ve isteği temsil eden bir HTTP isteği nesnesi alır.
HTTP Yöntemleri
HTTP protokolü, farklı işlemleri temsil eden çeşitli yöntemler kullanır. En yaygın yöntemlerden bazıları şunlardır:
- **GET**: Kaynak almak için kullanılır.
- **POST**: Sunucuya veri göndermek için kullanılır.
- **PUT**: Varolan bir kaynağı güncellemek için kullanılır.
- **DELETE**: Bir kaynağı silmek için kullanılır.
net/http paketi, bu yöntemleri işlemek için esneklik sağlar. Örneğin, “/products” URL’sindeki ürünleri listelemek için bir GET isteği ve belirli bir ürün eklemek için bir POST isteği işleyebileceğimiz bir örneğe bakalım:
“`go
package main
import (
“fmt”
“net/http”
)
func main() {
http.HandleFunc(“/products”, productsHandler)
http.ListenAndServe(“:8080”, nil)
}
func productsHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == “GET” {
fmt.Fprintf(w, “Ürün Listesi”)
} else if r.Method == “POST” {
fmt.Fprintf(w, “Yeni ürün eklendi”)
} else {
http.Error(w, “Geçersiz istek yöntemi”, http.StatusMethodNotAllowed)
}
}
“`
Bu örnekte, “productsHandler” fonksiyonu, gelen isteğin yöntemini kontrol eder ve buna göre işlev görür. GET isteği için ürün listesini döndürür ve POST isteği için yeni bir ürün ekler. Geçersiz bir yöntem için bir hata yanıtı gönderir.
Rota Gruplandırma
Uygulamanız büyüdükçe, rotaları yönetmek zorlaşabilir. Rotaları mantıksal gruplara ayırmak, kod düzenini iyileştirmek ve yönetimi basitleştirmek için rota gruplandırma kullanabilirsiniz. Bunu, özel bir yönlendirici oluşturarak ve ardından bu yönlendiriciyi net/http paketine entegre ederek yapabilirsiniz. İşte bir örnek:
“`go
package main
import (
“fmt”
“net/http”
)
type Router struct {
routes map[string]http.HandlerFunc
}
func NewRouter() *Router {
return &Router{
routes: make(map[string]http.HandlerFunc),
}
}
func (r *Router) AddRoute(path string, handler http.HandlerFunc) {
r.routes[path] = handler
}
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
handler, ok := r.routes[req.URL.Path]
if ok {
handler(w, req)
} else {
http.NotFound(w, req)
}
}
func main() {
router := NewRouter()
router.AddRoute(“/”, homeHandler)
router.AddRoute(“/products”, productsHandler)
http.Handle(“/”, router)
http.ListenAndServe(“:8080”, nil)
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Merhaba, Dünya!”)
}
func productsHandler(w http.ResponseWriter, r *http.Request) {
// İstek işleme kodu
}
“`
Bu örnekte, “Router” yapısı, rotaları depolamak için bir “routes” haritası içerir. “AddRoute” yöntemi, bir rota ekler ve “ServeHTTP” yöntemi, isteğin URL’sini eşleşen rota işlevini çağırır. “main” fonksiyonu, yeni bir yönlendirici oluşturur, rotaları ekler ve ardından “http.Handle” kullanarak yönlendiriciyi net/http paketine entegre eder.
Performans İpuçları
Performansı optimize etmek için dikkate alınması gereken bazı önemli ipuçları şunlardır:
- **Statik Dosya Sunucusu**: Statik dosyaları sunmak için yerleşik “http.FileServer” kullanın.
- **Önbellekleme**: Yanıtları önbelleklemek için HTTP önbellek başlıkları kullanın.
- **Yönlendirme Performansı**: Yönlendirme performansını iyileştirmek için “http.ServeMux” yapısı gibi önceden tanımlanmış yönlendiricileri kullanın.
- **Profil Oluşturma**: Yönlendirme performansını analiz etmek ve darboğazları tespit etmek için kodunuzu profilleyin.
Sonuç
Go’nun net/http paketi, web uygulamaları için sağlam bir yönlendirme sistemi sunar. Temel yönlendirme kavramları, HTTP yöntemleri ve rota gruplandırma hakkında bilgi edindikten sonra uygulamalarınızı daha etkili bir şekilde yapılandırabilir ve performansını optimize edebilirsiniz. Bu konuda daha fazla bilgi edinmek ve kendi Go web uygulamalarınızı geliştirmek için [fatihsoysal.com](https://fatihsoysal.com) adresindeki ek kaynakları inceleyebilirsiniz.
