Kontentga o‘tish

Marshrutlash ​

Kirish ​

Goravel marshrutlash moduli facades.Route() orqali boshqarilishi mumkin.

HTTP haydovchisi ​

Goravel sukut boʻyicha HTTP haydovchisi sifatida gin dan foydalanadi. Boshqa haydovchilardan foydalanish uchun ularni config/http.go faylida sozlang. Rasmiy sukut boʻyicha gin va fiber qoʻllab-quvvatlanadi.

HaydovchiHavola
Ginhttps://github.com/goravel/gin
Fiberhttps://github.com/goravel/fiber

Sukut boʻyicha marshrutlash fayli ​

Marshrutlash fayllarini aniqlash uchun oddiygina routes katalogiga o‘ting. Sukut bo‘yicha, framework routes/web.go faylida joylashgan namunaviy marshrutdan foydalanadi va u bootstrap/app.go::WithRouting funksiyasida ro‘yxatdan o‘tkaziladi.

Agar sizga aniqroq boshqaruv kerak bo‘lsa, routes katalogiga marshrutlash fayllarini qo‘shishingiz va ularni ham bootstrap/app.go::WithRouting funksiyasida ro‘yxatdan o‘tkazishingiz mumkin.

go
func Boot() contractsfoundation.Application {
	return foundation.Setup().
		WithRouting(func() {
	      routes.Web()
	    }).
		WithConfig(config.Boot).
		Create()
}

Marshrutlar Ro‘yxatini Olish ​

Marshrutlar ro‘yxatini ko‘rish uchun route:list buyrug‘idan foydalaning:

shell
./artisan route:list

Marshrutlash usullari ​

UsullarHarakat
GuruhGuruh marshrutlash
PrefiksMarshrut prefiksi
ServeHTTPMarshrutlarni testlash
OlingAsosiy marshrutlash
PostAsosiy marshrutlash
PutAsosiy marshrutlash
O‘chirishAsosiy marshrutlash
PatchAsosiy marshrutlash
ParametrlarAsosiy marshrutlash
AnyAsosiy Marshrutlash
ResursResurs marshrutlash
StaticFayl marshrutlash
StaticFileFayl marshrutlash
StaticFSFayl marshrutlash
MiddlewareMiddleware
GetRoutesBarcha marshrutlarni olish
NameMarshrut nomini belgilash
InfoMarshrut maʼlumotini olish

Asosiy marshrutlash ​

go
facades.Route().Get("/", func(ctx http.Context) http.Response {
  return ctx.Response().Json(http.StatusOK, http.Json{
    "Hello": "Goravel",
  })
})
facades.Route().Post("/", userController.Show)
facades.Route().Put("/", userController.Show)
facades.Route().Delete("/", userController.Show)
facades.Route().Patch("/", userController.Show)
facades.Route().Options("/", userController.Show)
facades.Route().Any("/", userController.Show)

Resurs marshrutlash ​

go
import "github.com/goravel/framework/contracts/http"

resourceController := NewResourceController()
facades.Route().Resource("/resource", resourceController)

type ResourceController struct{}
func NewResourceController () *ResourceController {
  return &ResourceController{}
}
// GET /resource
func (c *ResourceController) Index(ctx http.Context) {}
// GET /resource/{id}
func (c *ResourceController) Show(ctx http.Context) {}
// POST /resource
func (c *ResourceController) Store(ctx http.Context) {}
// PUT /resource/{id}
func (c *ResourceController) Update(ctx http.Context) {}
// DELETE /resource/{id}
func (c *ResourceController) Destroy(ctx http.Context) {}

Guruh marshrutlash ​

go
facades.Route().Group(func(router route.Router) {
  router.Get("group/{id}", func(ctx http.Context) http.Response {
    return ctx.Response().Success().String(ctx.Request().Query("id", "1"))
  })
})

Marshrut prefiksi ​

go
facades.Route().Prefix("users").Get("/", userController.Show)

Fayl marshrutlash ​

go
import "net/http"

facades.Route().Static("static", "./public")
facades.Route().StaticFile("static-file", "./public/logo.png")
facades.Route().StaticFS("static-fs", http.Dir("./public"))

Marshrut parametrlari ​

go
facades.Route().Get("/input/{id}", func(ctx http.Context) http.Response {
  return ctx.Response().Success().Json(http.Json{
    "id": ctx.Request().Input("id"),
  })
})

Batafsil Soʻrov

Middleware ​

go
import "github.com/goravel/framework/http/middleware"

facades.Route().Middleware(middleware.Cors()).Get("users", userController.Show)

Batafsil Middleware

Barcha marshrutlarni olish ​

go
routes := facades.Route().GetRoutes()

Marshrut nomini belgilash ​

go
facades.Route().Get("users", userController.Index).Name("users.index")

Marshrut maʼlumotini olish ​

go
route := facades.Route().Info("users.index")

Zaxira marshrutlar ​

Fallback usulidan foydalanib, kiruvchi soʻrovga boshqa hech qanday marshrut mos kelmasa bajariladigan marshrutni belgilashingiz mumkin.

go
facades.Route().Fallback(func(ctx http.Context) http.Response {
  return ctx.Response().String(404, "not found")
})

Cheklov tezligi ​

Cheklov tezligi limitlarini belgilash ​

Goravel berilgan marshrut yoki marshrutlar guruhi uchun trafik miqdorini cheklash uchun foydalanishingiz mumkin boʻlgan kuchli va sozlanishi mumkin boʻlgan cheklov tezligi xizmatlarini oʻz ichiga oladi. Boshlash uchun siz ilovangiz ehtiyojlariga javob beradigan cheklov konfiguratsiyalarini aniqlashingiz kerak, so‘ngra ularni bootstrap/app.go::WithCallback funksiyasida ro‘yxatdan o‘tkazishingiz kerak.

Cheklov tezligi limitlari facades.RateLimiter() ning For usuli yordamida belgilanadi. For usuli cheklov tezligi limiti nomini va cheklov tezligi limitiga tayinlangan marshrutlarga qoʻllanilishi kerak boʻlgan limit konfiguratsiyasini qaytaradigan yopilishni qabul qiladi. Cheklov tezligi limiti nomi siz xohlagan har qanday satr boʻlishi mumkin:

go
func Boot() contractsfoundation.Application {
  return foundation.Setup().
    WithConfig(config.Boot).
    WithCallback(func() {
      facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
        return limit.PerMinute(1000)
      })
    }).
    Create()
}

Agar kiruvchi soʻrov belgilangan tezlik chegarasidan oshib ketgan boʻlsa, Goravel tomonidan 429 HTTP holat kodi bilan javob avtomatik ravishda qaytariladi. Agar siz cheklov tezligi tomonidan qaytarilishi kerak boʻlgan oʻz javobingizni belgilamoqchi boʻlsangiz, javob usulidan foydalanishingiz mumkin:

go
facades.RateLimiter().For("global", func(ctx http.Context) http.Limit {
  return limit.PerMinute(1000).Response(func(ctx http.Context) {
    ctx.Request().AbortWithStatus(http.StatusTooManyRequests)
  })
})

Cheklovli so‘rovlar chaqiruvlari kiruvchi HTTP so‘rov namunasini qabul qilganligi sababli, siz kiruvchi so‘rov yoki autentifikatsiyadan o‘tgan foydalanuvchiga asoslanib, tegishli cheklovni dinamik tarzda yaratishingiz mumkin:

go
facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
  // Faraz qilaylik
  if is_vip() {
    return limit.PerMinute(100)
  }

  return nil
})

Cheklovlarni Segmentlash ​

Ba‘zan siz cheklovlarni ixtiyoriy qiymat bo‘yicha segmentlarga ajratmoqchi bo‘lishingiz mumkin. Masalan, siz foydalanuvchilarga har bir IP manzili uchun daqiqada 100 marta ma‘lum marshrutga kirish imkoniyatini berishni xohlashingiz mumkin. Buni amalga oshirish uchun cheklovni yaratishda By metodidan foydalanishingiz mumkin:

go
facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
  if is_vip() {
    return limit.PerMinute(100).By(ctx.Request().Ip())
  }

  return nil
})

Ushbu xususiyatni yana bir misol bilan tushuntirish uchun, marshrutga kirishni autentifikatsiyadan o‘tgan foydalanuvchi IDsi uchun daqiqada 100 marta yoki mehmonlar uchun har bir IP manzili uchun daqiqada 10 marta cheklashimiz mumkin:

go
facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
  if userID != 0 {
    return limit.PerMinute(100).By(userID)
  }

  return limit.PerMinute(10).By(ctx.Request().Ip())
})

Bir Nechta Cheklovlar ​

Agar kerak bo‘lsa, siz berilgan cheklov konfiguratsiyasi uchun cheklovlar massivini qaytarishingiz mumkin. Har bir cheklov marshrut uchun massiv ichida joylashgan tartibda baholanadi:

go
facades.RateLimiter().ForWithLimits("login", func(ctx contractshttp.Context) []contractshttp.Limit {
  return []contractshttp.Limit{
    limit.PerMinute(500),
    limit.PerMinute(100).By(ctx.Request().Ip()),
  }
})

Cheklovlarni Marshrutlarga Biriktirish ​

Cheklovlarni marshrutlarga yoki marshrut guruhlariga throttle middleware’i yordamida biriktirish mumkin. Throttle middleware’i marshrutga tayinlamoqchi bo‘lgan cheklov nomini qabul qiladi:

go
import github.com/goravel/framework/http/middleware

facades.Route().Middleware(middleware.Throttle("global")).Get("/", func(ctx http.Context) http.Response {
  return ctx.Response().Json(200, http.Json{
    "Hello": "Goravel",
  })
})

Cross-Origin Resource Sharing (CORS) ​

Goravel sukut bo‘yicha CORS’ni yoqilgan holda keladi, konfiguratsiyani config/cors.go faylida o‘zgartirish mumkin.

CORS va CORS sarlavhalari haqida qo‘shimcha ma‘lumot olish uchun iltimos, CORS bo‘yicha MDN veb hujjatlari bilan tanishib chiqing.

MIT litsenziyasi ostida chiqarilgan