Go-তে Routing এবং Middleware এর ব্যবহার
Go তে routing এবং middleware গুরুত্বপূর্ণ অংশ যা ওয়েব অ্যাপ্লিকেশন তৈরি করার সময় ব্যবহৃত হয়। Routing ওয়েব রিকোয়েস্টগুলিকে নির্দিষ্ট হ্যান্ডলার ফাংশনে পাঠানোর জন্য ব্যবহৃত হয়, এবং Middleware হল ফাংশনগুলির একটি চেইন যা রিকোয়েস্ট প্রক্রিয়াকরণের আগে, পরে বা তার মধ্যে কিছু নির্দিষ্ট কাজ করে।
Go তে net/http প্যাকেজ ব্যবহার করে সাধারণ HTTP সার্ভার তৈরি করা হয় এবং তাতে routing এবং middleware ব্যবহারের জন্য অনেক লাইব্রেরি রয়েছে, যেমন gorilla/mux, gin, echo, ইত্যাদি।
এখানে আমরা Go তে Routing এবং Middleware ব্যবহারের মৌলিক ধারণা আলোচনা করব।
১. Routing (রুটিং)
Routing হল একটি প্রক্রিয়া যা HTTP রিকোয়েস্টের URL পাথ এবং HTTP মেথড (GET, POST, PUT, DELETE) অনুযায়ী সঠিক হ্যান্ডলার ফাংশনে রিকোয়েস্টটি রিডাইরেক্ট করে।
১.১ Go-তে Basic Routing
Go-তে net/http প্যাকেজ ব্যবহার করে সাদামাটা রাউটিং করা যায়। নিচে একটি সহজ উদাহরণ দেওয়া হলো:
package main
import (
"fmt"
"net/http"
)
// Handler ফাংশন যা "Hello, World!" প্রিন্ট করবে
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
// রাউটিং করা
http.HandleFunc("/", helloHandler)
// সার্ভার শুরু করা
fmt.Println("Starting server at :8080...")
http.ListenAndServe(":8080", nil)
}এখানে:
http.HandleFunc("/", helloHandler): এই রাউটিংটি URL পাথ/এর জন্যhelloHandlerফাংশন কল করবে।http.ListenAndServe(":8080", nil): সার্ভার 8080 পোর্টে চলে।
আউটপুট: ব্রাউজারে গিয়ে http://localhost:8080/ এই URL এ গেলে "Hello, World!" বার্তা দেখাবে।
১.২ gorilla/mux প্যাকেজ দিয়ে Routing
গোরিলা মাক্স (Gorilla Mux) একটি জনপ্রিয় এবং শক্তিশালী HTTP রাউটার প্যাকেজ যা URL প্যারামিটার, রুট মেথড, এবং অন্যান্য কনফিগারেশন নিয়ন্ত্রণ করতে সহায়তা করে।
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
// Handler ফাংশন যা GET রিকোয়েস্ট গ্রহণ করবে
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", mux.Vars(r)["name"])
}
func main() {
// রাউটার তৈরি
r := mux.NewRouter()
// রাউটিং
r.HandleFunc("/hello/{name}", helloHandler).Methods("GET")
// সার্ভার শুরু করা
fmt.Println("Starting server at :8080...")
http.ListenAndServe(":8080", r)
}এখানে:
mux.NewRouter(): একটি নতুন রাউটার তৈরি করে।r.HandleFunc("/hello/{name}", helloHandler).Methods("GET"):/hello/{name}রুটে একটি ডাইনামিক প্যারামিটার{name}ব্যবহার করা হয়েছে।
আউটপুট:
এখন আপনি http://localhost:8080/hello/John এ গিয়ে "Hello, John!" বার্তা দেখতে পারবেন।
২. Middleware (মিডলওয়্যার)
Middleware হল একটি ফাংশন যা HTTP রিকোয়েস্ট আসার আগে বা পরে কাজ করে এবং রিকোয়েস্ট প্রসেসিং চেইনের মধ্যে সন্নিবেশিত হয়। এটি প্রাথমিকভাবে রিকোয়েস্ট ভ্যালিডেশন, অথেন্টিকেশন, লগিং, রিকোয়েস্ট/রেসপন্স মডিফিকেশন ইত্যাদি কাজের জন্য ব্যবহৃত হয়।
২.১ Go-তে Basic Middleware
Go তে সাদামাটা middleware তৈরি করার জন্য, আপনি একটি হ্যান্ডলার ফাংশনকে অন্য ফাংশনের মধ্যে এড করতে পারেন যা রিকোয়েস্টের পূর্বে বা পরে কাজ করে।
package main
import (
"fmt"
"net/http"
)
// Middleware Function
func logRequest(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Request received:", r.Method, r.URL.Path)
handler.ServeHTTP(w, r) // মূল হ্যান্ডলার ফাংশন কল
})
}
// Main Handler Function
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
// রাউটার তৈরি
http.HandleFunc("/", helloHandler)
// Middleware যুক্ত করা
http.Handle("/", logRequest(http.DefaultServeMux))
// সার্ভার শুরু করা
fmt.Println("Starting server at :8080...")
http.ListenAndServe(":8080", nil)
}এখানে:
logRequest: এটি একটি middleware ফাংশন যা রিকোয়েস্ট লোগ করে।handler.ServeHTTP(w, r): মূল রিকোয়েস্ট হ্যান্ডলার কল করা হয়েছে।
আউটপুট: ব্রাউজারে http://localhost:8080/ URL এ গেলে Request received: GET / বার্তা কনসোলে প্রদর্শিত হবে, এবং তারপর "Hello, World!" বার্তা রেসপন্স হিসেবে প্রদর্শিত হবে।
২.২ Multiple Middleware with gorilla/mux
Gorilla mux দিয়ে আমরা একাধিক middleware যোগ করতে পারি। এখানে একটি উদাহরণ দেখানো হলো, যেখানে লগিং এবং অথেন্টিকেশন middleware একসাথে ব্যবহার করা হয়েছে।
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
// Log middleware
func logMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Request received:", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
// Authentication middleware
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") == "" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
// Main handler
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
// New Router
r := mux.NewRouter()
// Apply middlewares
r.HandleFunc("/", helloHandler)
r.Use(logMiddleware) // Adding log middleware
r.Use(authMiddleware) // Adding auth middleware
// Start server
fmt.Println("Server is running at http://localhost:8080")
http.ListenAndServe(":8080", r)
}এখানে:
logMiddleware: রিকোয়েস্টের লগ রাখবে।authMiddleware: অথেন্টিকেশন চেক করবে এবং যদি অথেন্টিকেশন সফল না হয়, তাহলেUnauthorizedরেসপন্স ফেরত পাঠাবে।
আউটপুট:
- যদি
Authorizationহেডার না থাকে, তাহলেUnauthorizedরেসপন্স ফিরে আসবে। - যদি
Authorizationহেডার থাকে, তাহলে "Hello, World!" বার্তা ফেরত আসবে।
৩. Middleware এবং Routing চেইনিং
Go তে একটি একাধিক middleware চেইন তৈরি করা সম্ভব, যেখানে প্রতিটি middleware পরবর্তী middleware বা হ্যান্ডলারকে কল করবে। এটি কিছু সাধারণ কাজ যেমন রিকোয়েস্ট লগিং, অথেন্টিকেশন, CORS হ্যান্ডলিং ইত্যাদি করতে ব্যবহৃত হয়।
৩.১ Complex Middleware Example with Multiple Handlers
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
// Middleware 1
func logRequest(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Request received:", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
// Middleware 2 (Authentication)
func authenticate(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer secret-token" {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
// Final handler
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
r := mux.NewRouter()
// Applying Middlewares
r.HandleFunc("/", hello
Handler)
r.Use(logRequest) // Apply log middleware
r.Use(authenticate) // Apply auth middleware
fmt.Println("Server running at http://localhost:8080")
http.ListenAndServe(":8080", r)
}এখানে:
logRequestmiddleware রিকোয়েস্টের লগ রাখবে।authenticatemiddleware অথেন্টিকেশন চেক করবে।helloHandlerমূল রিকোয়েস্ট হ্যান্ডলার।
সারসংক্ষেপ
- Routing: Go তে রাউটিং
http.HandleFuncবাgorilla/muxএর মাধ্যমে করা হয়। এর মাধ্যমে URL পাথের সাথে মেলানো হ্যান্ডলার ফাংশন ডিফাইন করা হয়। - Middleware: Middleware হল এমন ফাংশন যা রিকোয়েস্ট আসার আগে বা পরে কাজ করে এবং বিভিন্ন কার্যকলাপ যেমন লগিং, অথেন্টিকেশন, রিকোয়েস্ট/রেসপন্স ম্যানিপুলেশন ইত্যাদি পরিচালনা করে।
- Middleware Chaining: Go তে একাধিক middleware চেইন করা যায় যা বিভিন্ন কাজ একসাথে পরিচালনা করতে সাহায্য করে।
Go তে Routing এবং Middleware ব্যবহারের মাধ্যমে আপনি সহজেই কার্যকরী ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারবেন যা রিকোয়েস্ট এবং রেসপন্সকে সঠিকভাবে পরিচালনা এবং প্রসেস করবে।
Read more