Skip to content

HttpRouter

Depo Adresi: julienschmidt/httprouter: A high performance HTTP request router that scales well (github.com)

Gin'in yönlendirme bileşeni HttpRouter kullanır. Bu da hafif ve yüksek performanslı bir yönlendirme bileşenidir. Tüm bileşen sadece üç .go dosyasından oluşur. Kod oldukça özdür. Başlıca özellikleri şunlardır.

Bire Bir Eşleşme: Bir istek yalnızca sıfır veya bir yönlendirmeye eşleşebilir. SEO optimizasyonu için avantajlıdır.

Otomatik Yol Düzeltme: İstediğiniz URL stilini seçin. Bir eğik çizgi fazla veya eksik olsa bile otomatik olarak yönlendirilir. Büyük/küçük harf hataları varsa doğru yönlendirme için büyük/küçük harf göz ardı edilir.

Yönlendirme Parametrelerini Otomatik Ayrıştırma: Yol segmentine bir ad verdiğinizde yönlendirici dinamik değeri size iletir. Yönlendiricinin tasarımı nedeniyle yol parametresi ayrıştırma maliyeti çok düşüktür.

Sıfır Çöp: Yönlendirme ve zamanlama sürecinde herhangi bir bellek çöpü oluşmaz.

RestfulAPI Desteği: Yönlendiricinin tasarımı makul katmanlı Restful API'yi teşvik eder.

Hata İşleme: İsteklerdeki istisnaları işlemek için bir hata işleyici ayarlayabilirsiniz. Yönlendirici bunları yakalar ve kaydeder ardından hata sayfasına yönlendirir.

Temel Kullanım

springboot gibi bir fonksiyon bir URL'ye bağlanır ve bir işleyiciye karşılık gelir.

go
package main

import (
   "fmt"
   "github.com/julienschmidt/httprouter"
   "log"
   "net/http"
)

func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
   fmt.Fprintf(w, "<h1>Hello World!")
}

func main() {
   router := httprouter.New()
   router.GET("/hello", Hello)
   log.Fatal(http.ListenAndServe(":8080", router))
}

Ardından tarayıcı veya herhangi bir arayüz test aracı ile 127.0.0.1:8080 adresine girdiğinizde doğru içeriği görebilirsiniz. HttpRouter'ın sadece yönlendirme yaptığını görüyoruz. Aslında hala net/http varsayılan bileşenini kullanır. gin de aynıdır. Sadece kapsülleme nispeten daha derindir.

Adlandırılmış Parametreler

go
package main

import (
   "fmt"
   "github.com/julienschmidt/httprouter"
   "log"
   "net/http"
)

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
   fmt.Fprintf(w, "<h1>Hello World!")
}

func main() {
   router := httprouter.New()
   router.GET("/hello:name", Hello)
   log.Fatal(http.ListenAndServe(":8080", router))
}

Bu sefer yönlendirmenin sonuna :name eklendi. name bir adlandırılmış parametredir. httprouter.Params aracılığıyla parametre dilimine erişebilirsiniz. İndeks veya ByName(name) ile parametreyi alabilirsiniz. Aynı şekilde http.handler ve http.handlerFunc'u httprouter.handler olarak kullanabilirsiniz. Yönlendirici arayüzünü uygular. Aşağıdaki örnekte olduğu gibi.

go
func Hello(w http.ResponseWriter, r *http.Request) {
    params := httprouter.ParamsFromContext(r.Context())
    //params := r.Context().Value(httprouter.ParamsKey) de olabilir

    fmt.Fprintf(w, "hello, %s!\n", params.ByName("name"))
}

Metodun bağladığı yönlendirme /user/:user olduğunda aşağıdaki URL eşleşme durumları:

 /user/gordon              eşleşme
 /user/you                 eşleşme
 /user/gordon/profile      eşleşme yok
 /user/                    eşleşme yok

/user/new ve /user/:user'ı aynı istek metoduna kaydedemezsiniz. Her istek metodu birbirinden bağımsız olmalıdır.

Tüm Parametreleri Yakalama

İkinci tür tüm parametreleri yakalamadır. Adı üstünde her şeyi eşleşirler. Bu nedenle Pattern'ın sonunda olmalıdırlar.

go
Pattern: /src/*filepath

 /src/                     eşleşme
 /src/somefile.go          eşleşme
 /src/subdir/somefile.go   eşleşme

HttpRouter'ın çalışma prensibi çok sayıda ön ek ağacı oluşturmaktır. İlgilenenler bakabilir: httprouter package - github.com/julienschmidt/httprouter - Go Packages.

OPTIONS & CORS

Bazıları OPTIONS için otomatik yanıtı değiştirmek ve CORS ön denetim isteği için bazı yanıt başlıkları ayarlamak isteyebilir. Bu gereksinimler Router.GlobalOPTIONS işleyicisi kullanılarak gerçekleştirilebilir.

go
router.GlobalOPTIONS = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if r.Header.Get("Access-Control-Request-Method") != "" {
        // CORS yanıt başlıklarını ayarla
        header := w.Header()
        header.Set("Access-Control-Allow-Methods", r.Header.Get("Allow"))
        header.Set("Access-Control-Allow-Origin", "*")
    }

    // Durum kodu 204'e uyum sağla
    w.WriteHeader(http.StatusNoContent)
})

NOT FOUND İşleyicisi

TIP

Bazı sorunları önlemek için Router.HandleMethodNotAllowed kapatılabilir.

go
router.NotFound = http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
  // Mantığınız
})

Temel Doğrulama

go
package main

import (
  "fmt"
  "log"
  "net/http"

  "github.com/julienschmidt/httprouter"
)

func BasicAuth(h httprouter.Handle, requiredUser, requiredPassword string) httprouter.Handle {
  return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    // Temel kimlik bilgilerini al
    user, password, hasAuth := r.BasicAuth()

    if hasAuth && user == requiredUser && password == requiredPassword {
      // İsteği verilen işleyiciye devret
      h(w, r, ps)
    } else {
      // Aksi takdirde kimlik doğrulama iste
      w.Header().Set("WWW-Authenticate", "Basic realm=Restricted")
      http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
    }
  }
}

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
  fmt.Fprint(w, "Not protected!\n")
}

func Protected(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
  fmt.Fprint(w, "Protected!\n")
}

func main() {
  user := "gordon"
  pass := "secret!"

  router := httprouter.New()
  router.GET("/", Index)
  router.GET("/protected/", BasicAuth(Protected, user, pass))

  log.Fatal(http.ListenAndServe(":8080", router))
}

Golang by www.golangdev.cn edit