Yönlendirme
Go Fiber çerçevesindeki rotaın rolü, HTTP isteği işleme desteği için farklı URL'leri işleme fonksiyonlarına bağlamaktır. Tüm web framework isteklerinin giriş noktası olarak hizmet verir.
Rota İşleyicileri (Fonksiyonlar)
Belirli HTTP metodlarına bağlı rotaları kaydet.
Not: Bazı çerçevelerde rota işleyicilerine denetleyiciler denir, genellikle aynı anlama gelir - gelen HTTP isteğini hangi fonksiyonun (metodun) işleyeceğini belirler.
Fonksiyon İmzası:
// HTTP metodları
func (app *App) Get(path string, handlers ...Handler) Router
func (app *App) Head(path string, handlers ...Handler) Router
func (app *App) Post(path string, handlers ...Handler) Router
func (app *App) Put(path string, handlers ...Handler) Router
func (app *App) Delete(path string, handlers ...Handler) Router
func (app *App) Connect(path string, handlers ...Handler) Router
func (app *App) Options(path string, handlers ...Handler) Router
func (app *App) Trace(path string, handlers ...Handler) Router
func (app *App) Patch(path string, handlers ...Handler) Router
// Değer olarak yöntemleri belirtmenizi sağlar
func (app *App) Add(method, path string, handlers ...Handler) Router
// Tüm HTTP metodları üzerinde rotayı kaydeder
// app.Use'a benzer ancak bir ön ek bağlamaz
func (app *App) All(path string, handlers ...Handler) Router
Örnek:
// Basit GET işleyici
app.Get("/api/list", func(c *fiber.Ctx) error {
return c.SendString("Bu bir GET isteğidir!")
})
// Basit POST işleyici
app.Post("/api/register", func(c *fiber.Ctx) error {
return c.SendString("Bu bir POST isteğidir!")
})
Use, orta yazılım ve ön ek URL interceptor'larını yüklemek için kullanılır. Bu rotalar sadece her yolun başlangıcını eşleştirir, örneğin, /john
/john/doe
, /johnnnnn
ve benzerlerini eşleştirir.
Özel orta yazılım fonksiyon imzası:
func (app *App) Use(args ...interface{}) Router
Örnek:
// Herhangi bir isteği eşleştir
app.Use(func(c *fiber.Ctx) error {
return c.Next()
})
// /api ile başlayan istekleri eşleştir
app.Use("/api", func(c *fiber.Ctx) error {
return c.Next()
})
// /api veya /home ile başlayan istekleri eşleştir (çoklu ön ekleri destekler)
app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
return c.Next()
})
// Birden fazla işleyici ekler
app.Use("/api", func(c *fiber.Ctx) error {
c.Set("X-Custom-Header", random.String(32))
return c.Next()
}, func(c *fiber.Ctx) error {
return c.Next()
})
Yol
Rota yolu, istek metodunun yanı sıra erişilebilecek uç noktaları tanımlar. Rota yolu bir dize veya dize deseni olabilir.
Dize tabanlı rota örnekleri
// Bu rota yolu kök yola, "/": gelen istekleri eşleştirir
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Kök yol")
})
// Bu rota yolu "/about" için gelen istekleri eşleştirir
app.Get("/about", func(c *fiber.Ctx) error {
return c.SendString("Hakkında")
})
// Bu rota yolu "/random.txt" için gelen istekleri eşleştirir
app.Get("/random.txt", func(c *fiber.Ctx) error {
return c.SendString("Rastgele.txt")
ExpressJs çerçevesine benzer şekilde, rotaların bildirildiği sıra önemlidir. Bir istek alındığında, rotalar bildirildikleri sırayla kontrol edilir.
Lütfen dikkat: Değişken parametreler içeren rotaların, beklenmeyen davranışlara yol açabilecek şekilde yanlış eşleşmelerden kaçınmak için, sabit parçalar içeren rotaların ardından yazıldığından emin olun.
Rota Parametreleri
Rota parametreleri, bir rota içinde dinamik unsurlardır ve ya isimli ya da isimsiz segmentler olabilir. Bu segmentler, URL'deki belirli pozisyonlardaki değerleri yakalamak için kullanılır. Bu değerlere erişmek için Params fonksiyonunu kullanabilirsiniz, fonksiyon parametresi yol içindeki rota parametresinin adıdır, ya da isimsiz parametreler için, karakterleri (*, +) ve sayılarını temsil eder.
Yıldız karakteri (*) veya artı işareti (+) obur parametreleri temsil eder.
Rotalar aynı zamanda isteğe bağlı parametreleri kullanma olanağı sağlar. İsimli parametreler için, bu parametreler soru işaretinden (?) sonra gelir, artı işareti ise isteğe bağlı değildir ve yıldız karakterleri isteğe bağlı ve obur parametre aralığını temsil etmek için kullanılabilir.
Rota parametreleriyle bir rota tanımlama örneği
// Parametreler
app.Get("/user/:name/books/:title", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s\n", c.Params("name"))
fmt.Fprintf(c, "%s\n", c.Params("title"))
return nil
})
// Artı işareti - obur - isteğe bağlı değil
app.Get("/user/+", func(c *fiber.Ctx) error {
return c.SendString(c.Params("+"))
})
// İsteğe bağlı parametre
app.Get("/user/:name?", func(c *fiber.Ctx) error {
return c.SendString(c.Params("name"))
})
// Yıldız karakteri - obur - isteğe bağlı
app.Get("/user/*", func(c *fiber.Ctx) error {
return c.SendString(c.Params("*"))
})
// Bu rota yolu, özel süslü karakterler olduğu için "/v1/some/resource/name:customVerb" isteğini eşleştirir
app.Get(`/v1/some/resource/name\:customVerb`, func(c *fiber.Ctx) error {
return c.SendString("Merhaba, Topluluk")
})
Böylelikle tire (-) ve nokta (.) karakterleri kelimenin tam anlamıyla yorumlandığı için, rota parametreleri ile birlikte kullanılarak faydalı amaçlara ulaşmak için kullanılabilir.
Tüm özel parametre karakterleri de \ ile kaçınılabileceği gibi, değerleri yok sayılır, dolayısıyla rota içinde kullanmak istiyorsanız. Belirsizliğe neden olmaması için Golang düzenli ifade belgesinde her zaman kullanıldığı gibi, backtick karakterleri `` önerilir ve kaçınma karakterleri düzenli ifade kalıbını yanlışlıkla etkilemez.
// http://localhost:3000/bitkiler/prunus.persica
app.Get("/bitkiler/:genus.:tür", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s.%s\n", c.Params("genus"), c.Params("tür"))
return nil // prunus.persica
})
// http://localhost:3000/uçuşlar/LAX-SFO
app.Get("/uçuşlar/:nereden-:nereye", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s-%s\n", c.Params("nereden"), c.Params("nereye"))
return nil // LAX-SFO
})
Akıllı yönlendirme, bu durumda tanıtılan parametre karakterlerinin istek rotasının bir parçası olması gerektiğini tanır ve buna göre işler.
// http://localhost:3000/dükkan/ürün/renk:mavi/boyut:xs
app.Get("/dükkan/ürün/renk::renk/boyut::boyut", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s:%s\n", c.Params("renk"), c.Params("boyut"))
return nil // mavi:xs
})
Ayrıca, rotalar birden fazla parametre ve ardışık isimsiz parametre karakterleri kullanarak, yıldız ya da artı karakterleri gibi, kullanıcıların rotalarda büyük olasılıkları oldukça genişletmektedir.
// GET /@v1
// Params: "imza" -> "@", "param" -> "v1"
app.Get("/:imza:param", işleyici)
// GET /api-v1
// Params: "ad" -> "v1"
app.Get("/api-:ad", işleyici)
// GET /müşteri/v1/sepet/proksi
// Params: "*1" -> "müşteri/", "*2" -> "/sepet"
app.Get("/*v1*/proksi", işleyici)
// GET /v1/marka/4/mağaza/mavi/xs
// Params: "*1" -> "marka/4", "*2" -> "mavi/xs"
app.Get("/v1/*/mağaza/*", işleyici)
Express yönlendirmeye zaten uygulamış bulunmaktayız, ancak hala düzenli ifadeleri desteklemediğinden dolayı, çünkü oldukça yavaştırlar.
Kısıtlamalar
Gelen URL ile eşleşme olduğunda ve URL yolu parametreler aracılığıyla route değerlerine bölündüğünde, kısıtlamalar yürütülecektir. Bu özellik v2.37.0
sürümünde tanıtılmış ve .NET Core'dan esinlenilmiştir.
Kısıtlamalar parametre doğrulaması için değildir. Eğer kısıtlama parametre değeri için geçersizse, Fiber bir 404 işleyici döndürecektir.
Kısıtlama | Örnek | Örnek Eşleşmeler |
---|---|---|
int | :id |
123456789, -123456789 |
bool | :active |
true, false |
guid | :id |
CD2C1638-1638-72D5-1638-DEADBEEF1638 |
float | :weight |
1.234, -1,001.01e8 |
minLen(değer) | :username<minLen(4)> | test (en az 4 karakter) |
maxLen(değer) | :filename<maxLen(8)> | MyFile (en fazla 8 karakter) |
len(uzunluk) | :filename<len(12)> | somefile.txt (12 karakter) |
min(değer) | :age<min(18)> | 19 (tekrarlanan değer en az 18 olmalıdır) |
max(değer) | :age<max(120)> | 91 (tekrarlanan değer en fazla 120'yi aşamaz) |
aralık(min,max) | :age<range(18,120)> | 91 (tekrarlanan değer en az 18 olmalı ancak 120'yi aşmamalıdır) |
alpha | :name |
Rick (dize en az bir veya daha fazla alfabedik karakterden oluşmalıdır, büyük-küçük harf hassas değildir, a-z) |
datetime | :dob<datetime(2006\\-01\\-02)> | 2005-11-01 |
regex(ifade) | :date<regex(\d{4}-\d{2}-\d{2})> | 2022-08-27 (düzenli ifadeye uymalıdır) |
Örnekler
- Tek Kısıtlama
- Birden Fazla Kısıtlama
- Düzenli İfade Kısıtlaması
app.Get("/:test", func(c *fiber.Ctx) error {
return c.SendString(c.Params("test"))
})
// curl -X GET http://localhost:3000/12 // 12
// curl -X GET http://localhost:3000/1 // GET /1 bulunamadı
Birden çok kısıtlama eklemek için `;` kullanabilirsiniz.
app.Get("/:test", func(c *fiber.Ctx) error { return c.SendString(c.Params("test")) })
// curl -X GET http://localhost:3000/120000 // GET /120000 bulunamadı
// curl -X GET http://localhost:3000/1 // GET /1 bulunamadı
// curl -X GET http://localhost:3000/250 // 250
Fiber rotaları kaydederken düzenli ifade sorgularını önceden derler, bu nedenle düzenli ifade kısıtlamaları için performans üzerinde herhangi bir etkisi yoktur.
```go
app.Get(`/:date`, func(c *fiber.Ctx) error {
return c.SendString(c.Params("date"))
})
// curl -X GET http://localhost:3000/125 // GET /125 bulunamadı
// curl -X GET http://localhost:3000/test // GET /test bulunamadı
// curl -X GET http://localhost:3000/2022-08-27 // 2022-08-27
> Tarih-saat kısıtlamaları (`*`,`+`,`?`,`:`,`/`,``,``,`>`,';`,`(`,`)`) kullanırken, yol içinde özel karakterlerin yanlış yorumlanmasını önlemek için özel karakterlerden önce `\\` kullanın.
**İsteğe Bağlı Parametre Örneği**
İsteğe bağlı parametrelere de kısıtlamalar ekleyebilirsiniz.
```go
app.Get("/:test?", func(c *fiber.Ctx) error {
return c.SendString(c.Params("test"))
})
// curl -X GET http://localhost:3000/42
// 42
// curl -X GET http://localhost:3000/
//
// curl -X GET http://localhost:3000/7.0
// GET /7.0 bulunamadı
Ara yazılım
İstekleri veya yanıtları manipüle etmek amacıyla tasarlanmış işlevlere ara yazılım işlevleri denir. Next
, şu anki rotaya eşleşen next
işlevini yürüten bir Fiber yönlendirme işlevidir.
Ara Yazılım İşlevi Örneği
app.Use(func(c *fiber.Ctx) error {
// Tüm yanıtlarda özel bir başlık ayarla:
c.Set("X-Custom-Header", "Merhaba, dünya")
// Bir sonraki ara yazılıma geç:
return c.Next()
})
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Merhaba, dünya!")
})
Use
yönteminin yolu, bir işlem yolu veya önek yol olabilir ve bu yol, yalnızca bu yol ile başlayan isteklere uygulanacak ara yazılımı kısıtlar.
Çalışma Zamanında Rota Sınırlamaları Eklemek
Tasarım ve performans nedenleriyle, uygulama başlatıldıktan sonra dinamik olarak rotalar eklemek desteklenmemektedir. Lütfen tüm rotaların uygulama başlamadan önce tanımlı olduğundan emin olun.
Gruplama
Eğer çok sayıda uç noktanız varsa, rotaları düzenlemek için Group
'u kullanabilirsiniz.
func main() {
app := fiber.New()
api := app.Group("/api", araYazılım) // /api
v1 := api.Group("/v1", araYazılım) // /api/v1
v1.Get("/list", işleyici) // /api/v1/list
v1.Get("/user", işleyici) // /api/v1/user
v2 := api.Group("/v2", araYazılım) // /api/v2
v2.Get("/list", işleyici) // /api/v2/list
v2.Get("/user", işleyici) // /api/v2/user
log.Fatal(app.Listen(":3000"))
}