রাউটিং
গো ফাইবার ফ্রেমওয়ার্কে রুটের ভূমিকা হল বিভিন্ন URL গুলোকে হ্যান্ডলিং ফাংশনগুলিতে বাঁধানো, HTTP অনুরোধ প্রসেসিং সাপোর্ট করার জন্য। এটি অল্প একটি ওয়েব ফ্রেমওয়ার্ক অনুরোধের প্রবেশ পথ হিসেবে পরিষেবা করে।
রাউট হ্যান্ডলার (ফাংশন)
নির্দিষ্ট HTTP মেথডের সাথে জড়িত রুটগুলি নিবন্ধন করুন।
লক্ষ্য করুন: কিছু ফ্রেমওয়ার্কে, রুট হ্যান্ডলারগুলি কন্ট্রোলারগুলি হিসেবে ঘোষিত হয়, যা সাধারণত একই অর্থ রেখে—আসা আসা কোন ফাংশন (মেথড) যা ইনকামিং HTTP অনুরোধ হ্যান্ডেল করবে তা নির্ধারণ করা।
ফাংশন স্বাক্ষর:
// HTTP methods
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 allows you to specify methods as values
func (app *App) Add(method, path string, handlers ...Handler) Router
// সব এইচটিটিপি মেথডে রুটগুলি নিবন্ধন করা হয়
// app.Use এর মত কিন্তু একটি প্রিফিক্স বাঁধানো নেই
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 অনুরোধ!")
})
Use মিডলওয়্যার এবং প্রিফিক্স URL ইন্টারসেপ্টর লোড করার জন্য ব্যবহৃত হয়। এই রুটগুলি শুধুমাত্র প্রতিটি পথের শুরু মিলায়, উদাহরণস্বরূপ, /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("বিছানা.টেক্সট")
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 // blue: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)
আমরা ইতিমধ্যে এক্সপ্রেস রাউটিংকে অনুকূল করেছি, কিন্তু এটা এখনও নিয়মিত অভিব্যক্তি সমর্থন করে না কারণ তারা প্রায় ধীর।
বাধ্যবাধকসমূহ
আসছে URL সাথে মিল পাওয়ার সময় এবং URL পথটি প্যারামিটার দ্বারা রুট মান দ্বারা ভাগ করা হলে, বাধ্যবাধকগুলি প্রযোজ্য হবে। এই বৈশিষ্ট্যটি v2.37.0
দিয়ে আনা হয়েছিল এবং .NET কোর থেকে উৎসাহিত হয়েছিল।
বাধ্যবাধকগুলি প্যারামিটার যাচাই করার জন্য নয়। যদি প্যারামিটারের মান বাধ্যবাধকের জন্য অবৈধ হয়, তবে Fiber একটি 404 হ্যান্ডলার প্রদান করবে।
বাধ্যবাধক | উদাহরণ | উদাহরণ মেলা |
---|---|---|
int | :id |
123456789, -123456789 |
bool | :active |
true, false |
guid | :id |
CD2C1638-1638-72D5-1638-DEADBEEF1638 |
float | :weight<float> | 1.234, -1,001.01e8 |
minLen(value) | :username<minLen(4)> | test (অন্তত ৪টি অক্ষর) |
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"))
})
// কারল -X GET http://localhost:3000/12 // 12
// কারল -X GET http://localhost:3000/1 // GET /1 পাওয়া যায়নি
আপনি `;` ব্যবহার করে একাধিক বাধ্যবাধক যোগ করতে পারেন।
app.Get("/:test", func(c *fiber.Ctx) error { return c.SendString(c.Params("test")) })
// কারল -X GET http://localhost:3000/120000 // GET /120000 পাওয়া যায়নি
// কারল -X GET http://localhost:3000/1 // GET /1 পাওয়া যায়নি
// কারল -X GET http://localhost:3000/250 // 250
Fiber রুট নিবন্ধন করার সময় রেগুলার এক্সপ্রেশন বাধ্যবাধকের জন্য পূর্ব-পূর্ণ অনুসন্ধান প্রযোজ্য হয়, তাই নিজেস্ব বিশেষ ক্ষমতা নেই।
```go
app.Get(`/:date`, func(c *fiber.Ctx) error {
return c.SendString(c.Params("date"))
})
// কারল -X GET http://localhost:3000/125 // GET /125 পাওয়া যায়নি
// কারল -X GET http://localhost:3000/test // GET /test পাওয়া যায়নি
// কারল -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"))
})
// কারল -X GET http://localhost:3000/42
// 42
// কারল -X GET http://localhost:3000/
//
// কারল -X GET http://localhost:3000/7.0
// GET /7.0 পাওয়া যায়নি
মিডলওয়্যার
অনুরোধ বা প্রতিক্রিয়া পরিবর্তন করতে নকশা করা করা ফাংশনগুলি মিডলওয়্য়ার ফাংশন বলা হয়। পরবর্তী
একটি Fiber রাউটিং ফাংশন যা, যখন কল করা হয়, বর্তমান রুটের সাথে মিলটো ফাংশনটি বিচার করে।
মিডলওয়্যার ফাংশন উদাহরণ
app.Use(func(c *fiber.Ctx) error {
// সব প্রতিক্রিয়ায় অনুসন্ধান তোল:
c.Set("X-Custom-Header", "হ্যালো, বিশ্ব")
// পরবর্তী মিডলওয়্য়ারে চলুন:
return c.Next()
})
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("হ্যালো, বিশ্ব!")
})
Use
পদ্ধতির জন্য পথ হতো একটি মাউন্ট পাথ বা প্রিফিক্স পথ, এবং এটি বাধাও অনুপ্রেরণা আবেদনের জন্য কোন এই পথ দিয়ে শুরু হওয়া মিডলওয়্য়ারের সীমাবদ্ধতা তৈরি করে।
রানটাইমে রুট সীমনাতিদান যোগ করা
ডিজাইন এবং কার্যক্ষমতা বিবেচনাগুলি কারণে, অ্যাপ্লিকেশন স্টার্টআপের পরে রাউটগুলি গতিপ্রদান করা সমর্থন করা হয় না। দয়া করে নিশ্চিত করুন যে সমস্ত রাউট অ্যাপ্লিকেশন শুরু হওয়ার আগে সংজ্ঞায়িত হয়েছে।
গ্রুপ করা
যদি আপনার অনেক এন্ডপয়েন্ট থাকে তবে রুটগুলি বিন্যাস করতে গ্রুপ
ব্যবহার করতে পারেন।
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"))
}