Lập trình web back-end với Go (phần 3): Middleware

08 tháng 08, 2019 - 1949 lượt xem

Chào mừng các bạn quay trở lại với series bài viết về lập trình Web Back-End bằng ngôn ngữ Golang, sử dụng IRIS Framework

Nếu cảm thấy chưa thành thạo với Golang và muốn tìm hiểu thêm, các bạn có thể đọc series bài viết về Golang của Techmaster

bài viết trước, tôi đã giới thiệu về cách điều hướng và xử lý các web request (Routing) trong IRIS Framework.

Trong bài viết này, tôi giới thiệu về cách tạo các middleware với IRIS

1. Khái niệm

Middleware là một khái niệm tương đối rộng trong phần mềm chứ không chỉ gói gọn trong thế giới lập trình web. Các bạn có thể tham khảo định nghĩa tại đây. Còn trong thế giới lập trình web, cụ thể là lập trình web back-end, thì middleware là những đoạn mã trung gian nằm giữa các request và response. Nó nhận các request, thi hành các mệnh lệnh tương ứng trên request đó. Sau khi hoàn thành nó response (trả về) hoặc chuyển kết quả xử lý cho một middleware khác trong hàng đợi.

Middleware
Middleware trong lập trình web

2. Tạo middleware với IRIS

Một middleware trong IRIS là một function nhận đầu vào là 1 biến dạng iris.Context. Middleware được thực thi khi một middleware liền trước nó gọi method ctx.Next()

func before(ctx iris.Context) {
	log.Printf("Thời gian nhận request: %s", time.Now())
    // gọi method Next để chuyển sang middleware tiếp theo
	ctx.Next()
}

func after(ctx iris.Context) {
	result := ctx.Values().Get("main")
	log.Println(result)
	log.Println("Xử lý xong request")
}

// hàm xử lý chính cũng được coi là một middleware
func handler(ctx iris.Context) {
	ctx.HTML("Tạo middleware với IRIS framework")
    // Truyền biến main sang middleware tiếp theo
	ctx.Values().Set("main", "received from main handler")
	ctx.Next()
}

func main() {
	app := iris.New()
	app.Get("/", before, handler, after)
	app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}

Tham khảo code demo: https://github.com/handuy/golang_web_techmaster/blob/master/iris-middleware-basic/main.go

Kết quả:

Kết quả chạy middleware
Kết quả chạy middleware

Một middleware có thể được khai báo một lần và sử dụng cho tất cả các web request:

func before(ctx iris.Context) {
	log.Printf("Tên đường dẫn: %s. Thời gian nhận request: %s", ctx.Path(), time.Now())
	ctx.Next()
}

func mainHandler(ctx iris.Context) {
	ctx.HTML("Trang chủ")
}

func courseHandler(ctx iris.Context) {
	ctx.HTML("Trang danh sách khóa học")
}

func main() {
	app := iris.New()
	// Đăng kí hàm before làm middleware cho cả 2 route / và /khoa-hoc
	app.Use(before)
	app.Get("/", mainHandler)
	app.Get("/khoa-hoc", courseHandler)
	app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}

Tham khảo code demo: https://github.com/handuy/golang_web_techmaster/blob/master/iris-middleware/main.go

Middleware được ứng dụng trong nhiều trường hợp, ví dụ xử lý logic đăng nhập: Khi người dùng truy cập một đường dẫn yêu cầu đăng nhập, server sẽ sử dụng middleware để check xem user đã đăng nhập chưa, nếu chưa đăng nhập thì server sẽ redirect sang trang đăng nhập/đăng kí tài khoản

Trên đây là hướng dẫn và một số ví dụ về tạo middleware trong IRIS. Trong bài tiếp theo, tôi sẽ hướng dẫn các bạn trả về các file tĩnh (CSS, Javascript, ảnh, ...) mỗi khi có request từ client

Nguồn tham khảo:

https://github.com/kataras/iris/wiki/Routing-middleware


1 phút dành cho quảng cáo (again) :v

Techmaster đang có Lộ trình đào tạo Full-Stack Developer trong 8 tháng, cam kết việc làm cho các bạn học viên tốt nghiệp. Học viên đã tốt nghiệp sau 2 tháng nếu vẫn không xin được việc thì sẽ được hoàn lại 100% học phí.

Nếu các bạn chỉ quan tâm đến lập trình Web Back-End và muốn học một khóa ngắn gọn, cô đọng, có nhiều ví dụ thực tế có thể áp dụng được ngay, các bạn có thể tham khảo khóa Xây dựng ứng dụng Web bán hàng bằng Golang

Bình luận

avatar
Nguyễn Hàn Duy 2020-03-02 03:30:14.885972 +0000 UTC
Thanks ad
Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +1 Thích
+1