راستوں کا منظر نامہ

راستے

Go Fiber فریم ورک میں راستے کا کردار، مختلف یو آر ایلز کو ہینڈلنگ فنکشنز سے منسلک کرنا ہے، تاکہ ایچ ٹی ٹی پی درخواست کی پروسیسنگ کی حمایت کی جا سکے۔ یہ تمام ویب فریم ورک درخواستوں کے لئے داخلی نقطہ کار بنتا ہے۔

راستے ہینڈلرز (فنکشنز)

مختص HTTP میتھڈز کے ساتھ منسلک راستوں کو رجسٹر کریں۔

نوٹ: کچھ فریم ورک میں راستے ہینڈلر کونٹرولرز کہلاتے ہیں، جو عموماً ایک ہی معنی رکھتے ہیں۔ یعنی آنے والی ایچ ٹی ٹی پی درخواست کو ہینڈل کرنا۔

فنکشن سگنیچر:

// ایچ ٹی ٹی پی میتھڈز
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

// Add آپ کو قدرت کے طور پر میتھڈز کو قیمتوں کے طور پر مخصوص کرنے کی اجازت دیتا ہے
func (app *App) Add(method, path string, handlers ...Handler) Router

// All تمام ایچ ٹی ٹی پی میتھڈز پر راستے رجسٹر کرتا ہے
// اپلیکیشن کو استعمال کرنے کے لئے ہوتا ہے لیکن ایک پریفکس منسلک نہیں کرتا
func (app *App) All(path string, handlers ...Handler) Router

مثال:

// سادہ GET ہینڈلر
app.Get("/api/list", func(c *fiber.Ctx) error {
  return c.SendString("یہ ایک GET درخواست ہے!")
})

// سادہ POST ہینڈلر
app.Post("/api/register", func(c *fiber.Ctx) error {
  return c.SendString("یہ ایک POST درخواست ہے!")
})

استعمال نقلیت کو لوڈ کرنے اور یو آر ایلز میں پریفکس انٹرسیپٹرز کو استعمال کرنے کے لئے استعمال ہوتا ہے۔ یہ راستے صرف ہر پیٹھ کا شروع میں مچ ہوتے ہیں، مثلاً، /john کو /john/doe، /johnnnnn اور اسی طرح سے میچ ہو گا۔

کسٹم مڈل ویئر فنکشن سگنیچر:

func (app *App) Use(args ...interface{}) Router

مثال:

// کسی بھی درخواست کو میچ کریں
app.Use(func(c *fiber.Ctx) error {
    return c.Next()
})

// /api سے شروع ہونے والی درخواست کا میچ کریں
app.Use("/api", func(c *fiber.Ctx) error {
    return c.Next()
})

// /api یا /home سے شروع ہونے والی درخواست کا میچ کریں (مخصوص پریفکس کا حمایت کرتا ہے)
app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
    return c.Next()
})

// متعدد ہینڈلرز شامل کریں
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()
})

راہ

راستہ پتھ، ایچ ٹی ٹی پی میتھڈ کے ساتھ ملا کر اس نقطہ کار کو تعین کرتا ہے جو دسترسی حاصل کی جا سکتی ہے۔ راستہ پتھ ایک سٹرنگ یا سٹرنگ پیٹرن ہو سکتا ہے۔

سٹرنگ بیسڈ راستے کی مثالیں

// یہ راستہ پتھ درخواستوں کا میچ کرے گا روٹ پتھ، "/":
app.Get("/", func(c *fiber.Ctx) error {
  return c.SendString("روٹ پتھ")
})

// یہ راستہ پتھ درخواستوں کا میچ کرے گا "/about":
app.Get("/about", func(c *fiber.Ctx) error {
  return c.SendString("کے بارے میں")
})

// یہ راستہ پتھ درخواستوں کا میچ کرے گا "/random.txt":
app.Get("/random.txt", func(c *fiber.Ctx) error {
  return c.SendString("Random.txt")

ExpressJs فریم ورک کی طرح، راستوں کو بیان کرنے کی ترتیب اہم ہے۔ جب بھی ایک درخواست موصول ہوتی ہے، تو راستے ان کی بیان کی گئی ترتیب میں چیک کیے جاتے ہیں۔

براہ کرم نوٹ کریں: یقینی پیرامیٹرز کے ساتھ راستے پورے ہونے والے حصوں والے راستوں کے بعد لکھے جاتے ہیں تاکہ یہ متغیر حصوں کو غلطی سے میچ نہ کیا جائے، جو غیر متوقع رویہ پیدا کر سکتا ہے۔

روٹ پیرامیٹرز

روٹ پیرامیٹرز روٹ میں پیش آنے والے پیش نظر داروں کو ظاہر کرتے ہیں اور یہاں یا تو نامی ہوتے ہیں یا بے نام حصے. یہ حصے یو آر ایل میں مقررہ مقاموں پر قدرتی اقدار کو حاصل کرنے کے لیے استعمال ہوتے ہیں۔ آپ Params فعل کا استعمال کر کے ان قیمتوں کو حاصل کر سکتے ہیں جہاں فعل کا پیرامیٹر روٹ میں پیرامیٹر کا نام ہوتا ہے، یا بے نام پیرامیٹرز کے لیے، یہ شخصیتیں (*, +) ہیں اور ان کی تعداد ہوتی ہے۔

جوکھی (* یا +) عیسا کردار ہوتا ہے یا ضرورت مند پیرامیٹرز کو ظاہر کرتا ہے۔

روٹز کیلئے اختیار کردہ پیرامیٹرز کا استعمال بھی ممکن ہے۔ نامی پیرامیٹرز کے لیے، یہ پیرامیٹرز سوال کا نشان (?) ہوتے ہیں جبکہ پلس کردار ضروری ہوتا ہے، اور آپ بے نام پیرامیٹرز استعمال کرکے اختیاری اور ضرورت کے مطابقت سے جائزہ حاصل کر سکتے ہیں۔

روٹ کا تعریف کرنے کا مثال

// پیرامیٹرز
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
})
// پلس - جوکھی - غیر اختیاری
app.Get("/user/+", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("+"))
})

// اختیاری پیرامیٹر
app.Get("/user/:name?", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("name"))
})

// وائلڈ کارڈ - جوکھی - اختیاری
app.Get("/user/*", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("*"))
})

// یہ روٹ پیش نظر کے اندراج کردہ پیرامیٹر شخصیات کو ریکویسٹ "/v1/some/resource/name:customVerb" کو مطابقت رکھے گا کیونکہ پیرامیٹر شخصیات کو ان سے بچایا گیا ہے
app.Get(`/v1/some/resource/name\:customVerb`, func(c *fiber.Ctx) error {
    return c.SendString("ہیلو، کمیونٹی")
})

ہائفنز (-) اور نقطے (.) حرف بہ حرف تشکیل دیتے ہیں، انہیں پیرامیٹر شخصیات کے ساتھ استعمال کیا جا سکتا ہے تاکہ فائدہ مند مقصدی حاصل کیا جا سکے۔

تمام خصوصی پیرامیٹر شخصیات کو \ کا استعمال کر کے بھی بچایا جا سکتا ہے اور ان کے قیمت کو نظرانداز کیا جائے گا، لہذا اگر آپ چاہتے ہیں کہ آپ انہیں روٹ میں استعمال کریں تو مشورہ ہے کہ آپ بیک ٹک استعمال کریں، جیسا کہ گو ریگولر ایکسپریشن دستاویز میں ہمیشہ یہاں استعمال ہوتے ہیں تاکہ کوئی شبہ نہ ہو اور اسکی وجہ سے یہ بھول سے ریگولر ایکسپریشن کے پیٹرن کو متاثر نہ کریں۔

// http://localhost:3000/plantae/prunus.persica
app.Get("/plantae/:genus.:species", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s.%s\n", c.Params("genus"), c.Params("species"))
    return nil // prunus.persica
})
// http://localhost:3000/flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s-%s\n", c.Params("from"), c.Params("to"))
    return nil // LAX-SFO
})

ہمارا ذہین راستہ تشخیص دیتا ہے کہ مندرجہ ذیل ریکویسٹ روٹ کا حصہ ہونی چاہئیں اور اس کو اس طرح سے سنبھال سکتا ہے۔

// http://localhost:3000/shop/product/color:blue/size:xs
app.Get("/shop/product/color::color/size::size", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s:%s\n", c.Params("color"), c.Params("size"))
    return nil // نیلا:xs
})

علاوہ ازیں، روٹز میں کئی پیرامیٹرز اور کئی بے نام پیرامیٹر شخصیات کا استعمال کیا جا سکتا ہے جیسے کہ وائلڈ کارڈ یا پلس کردار، جوکھی شخصیات، جو استعمال کرنے والے کیلئے ممکنات کو بڑھا دیتے ہیں۔

// GET /@v1
// Params: "sign" -> "@", "param" -> "v1"
app.Get("/:sign:param", handler)

// GET /api-v1
// Params: "name" -> "v1" 
app.Get("/api-:name", handler)

// GET /customer/v1/cart/proxy
// Params: "*1" -> "customer/", "*2" -> "/cart"
app.Get("/*v1*/proxy", handler)

// GET /v1/brand/4/shop/blue/xs
// Params: "*1" -> "brand/4", "*2" -> "blue/xs"
app.Get("/v1/*/shop/*", handler)

ہم نے فی الحال ایکسپریس روٹنگ کے لئے روٹنگ ایڈاپٹ کر دیا ہے، لیکن ابھی تک ہمارے پاس ریگولر ایکسپریشن کو سپورٹ نہیں کر رہے ہیں کیونکہ یہ نسبتاً انتہائی سستا ہوتے ہیں۔

محدودیتیں

اگر آنے والے یو آر ایل کے ساتھ میچ ہوجائے اور یو آر ایل پیٹھ کو مقدمہ قیمتوں کے ذریعے روٹ قیمتوں میں تقسیم کیا گیا ہو، تو محدودیتیں لاگو ہوں گی۔ یہ خصوصیت v2.37.0 میں داخل ہوئی اور دو نیٹ کور نے اس پر مستلح کیا۔

محدودیتیں پیرامیٹر ویلیڈیشن کے لیے نہیں ہیں۔ اگر پیرامیٹر قیمت کے لئے محدودیت غلط ہو تو فائبر 404 ہینڈلر واپس کرے گا۔

محدودیت مثال مثال ملاپات
int :id 123456789, -123456789
bool :active true, false
guid :id CD2C1638-1638-72D5-1638-DEADBEEF1638
float :weight 1.234, -1,001.01e8
minLen(value) :username<minLen(4)> test (کم از کم 4 حروف)
maxLen(value) :filename<maxLen(8)> MyFile (تا حد 8 حروف)
len(length) :filename<len(12)> somefile.txt (12 حروف)
min(value) :age<min(18)> 19 (صحیح قیمت کم از کم 18 ہونی چاہئے)
max(value) :age<max(120)> 91 (صحیح قیمت 120 سے زیادہ نہیں ہوسکتی)
range(min,max) :age<range(18,120)> 91 (صحیح قیمت کم از کم 18 ہونی چاہئے اور 120 سے زیادہ نہیں ہوسکتی)
alpha :name Rick (حروف کا ایک یا اس سے زیادہ مشتمل ہونا چاہئے، کچھ بھی ہو سکتا ہے، a-z)
datetime :dob<datetime(2006\\-01\\-02)> 2005-11-01
regex(expression) :date<regex(\d{4}-\d{2}-\d{2})> 2022-08-27 (موجودہ ریگولر ایکسپریشن کے مطابق ہونا چاہئے)

مثالیں

  • ایک محدودیت
  • کئی محدودیتیں
  • ریگولر ایکسپریشن محدودیت
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 نہیں مل سکا


آپ `;` کا استعمال کرکے مختلف محدودیتیں شامل کرسکتے ہیں۔

app.Get("/:test", func(c *fiber.Ctx) error { return c.SendString(c.Params("test")) })

// curl -X GET http://localhost:3000/120000 // GET /120000 نہیں مل سکا

// curl -X GET http://localhost:3000/1 // GET /1 نہیں مل سکا

// curl -X GET http://localhost:3000/250 // 250


فائبر روٹس رجسٹر کرتے وقت ریگولر ایکسپریشن کمپائل کرتا ہے، اس لئے ریگولر ایکسپریشن محدودیت کے لئے کوئی کارکردگی کا بوجہ نہیں ہوتا۔

```go
app.Get(`/:date`, func(c *fiber.Ctx) error {
  return c.SendString(c.Params("date"))
})

// curl -X GET http://localhost:3000/125 // GET /125 نہیں مل سکا

// curl -X GET http://localhost:3000/test // GET /test نہیں مل سکا

// curl -X GET http://localhost:3000/2022-08-27 // 2022-08-27


> جب تاریخ وقت کی محدودیتیں استعمال کر رہے ہوں (`*`,`+`,`?`,`:`،`,`,``,``,`>`,`;`,`(`,`)`), روٹ میں خصوصی علاؤ حروف کا استعمال کرنے سے گمراہی کے بغیر `\\` استعمال کریں۔

**اختیاری پیرامیٹر مثال**

آپ اختیاری پیرامیٹرز پر بھی محدودیتیں شامل کرسکتے ہیں۔
```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 نہیں مل سکا

مِڈل ویئر

وہ فَنکشنز جو درخواست یا جواب کو ترتیب دینے کے لیے تخلیق کئے گئے ہیں، اُنہیں مِڈل ویئر فَنکشن کہا جاتا ہے۔ Next ایک Fiber راستہ تلاش فَنکشن ہے جو جب بُلایا جائے، وہ موجودہ راستے سے مماثل next فَنکشن کو اُنجام دیتا ہے۔

مِڈل ویئر فَنکشن کا مثال

app.Use(func(c *fiber.Ctx) error {
  // تمام جوابات میں ایک کسٹم ہیڈر سیٹ کریں:
  c.Set("X-Custom-Header", "Hello, world")

  // اگلے مِڈل ویئر کی طرف بڑھیں:
  return c.Next()
})

app.Get("/", func(c *fiber.Ctx) error {
  return c.SendString("Hello, world!")
})

Use میتھڈ کا راستہ ایک ماؤنٹ پاٹھ یا پریفکس پاٹھ ہوسکتا ہے، اور یہ مِڈل ویئر کو سرف اُس وقت لاگو کرنے کی پابندی لگاتا ہے جب ریکویسٹ کے پاٹھ کا آغاز اُس پاٹھ سے ہو۔

ران ٹائم پر راستوں کی حدوں کو شامل کرنا

ڈیزائن اور کارکردگی کے مدنظر سے، ایپلیکیشن کی شروعات کے بعد راستے کو حرکی طور پر شامل کرنا ممکن نہیں ہے۔ براہ کرم یہ یقینی بنائیں کہ تمام راستے ایپلیکیشن شروع ہونے سے پہلے معین ہوں۔

گروپنگ

اگر آپ کے پاس بہت سارے اِنڈ پوائنٹس ہیں، تو آپ روٹوں کو منظم کرنے کے لیے Group کا استعمال کرسکتے ہیں۔

func main() {
  app := fiber.New()

  api := app.Group("/api", middleware) // /api

  v1 := api.Group("/v1", middleware)   // /api/v1
  v1.Get("/list", handler)             // /api/v1/list
  v1.Get("/user", handler)             // /api/v1/user

  v2 := api.Group("/v2", middleware)   // /api/v2
  v2.Get("/list", handler)             // /api/v2/list
  v2.Get("/user", handler)             // /api/v2/user

  log.Fatal(app.Listen(":3000"))
}