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ề ngôn ngữ Golang và IRIS framework, cách cài đặt và tổng quan về những chức năng mà IRIS cung cấp để giúp các bạn lập trình web back-end.

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

1. Tạo đường dẫn và đăng kí hàm xử lý web request

Để tạo các đường dẫn và các hàm xử lý tương ứng, ta sử dụng method Handle mà IRIS cung cấp:

package main

import (
	"github.com/kataras/iris"
)

func homeHandler(ctx iris.Context) {
	ctx.HTML("Chào mừng đến với Techmaster Việt Nam")
}

func courseHandler(ctx iris.Context) {
	ctx.HTML("Danh sách khóa học của Techmaster Việt Nam")
}

func main() {
	app := iris.New()
	app.Handle("GET", "/", homeHandler)
	app.Handle("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-routing-basic/main.go

IRIS hỗ trợ tất cả các phương thức HTTP: GET, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT, HEAD, PATCH

Trong đoạn code trên, ta thấy method app.Handle nhận 3 tham số đầu vào:

- Tên phương thức HTTP: Trong ví dụ trên là GET

- Tên đường dẫn ("/" và "/khoa-hoc")

- Hàm xử lý request (homeHandlercourseHandler): Nhận tham số đầu vào là một biến có kiểu dữ liệu iris.Context

Bên cạnh method Handle, IRIS cũng cung cấp các method tương ứng với từng phương thức HTTP để cho code ngắn gọn hơn:

package main

import (
	"github.com/kataras/iris"
)

func homeHandler(ctx iris.Context) {
	ctx.HTML("Chào mừng đến với Techmaster Việt Nam") 
} 

func courseHandler(ctx iris.Context) { 
    ctx.HTML("Đây là trang danh sách khóa học") 
} 

func main() { 
    app := iris.New() 
    app.Get("/", homeHandler) 
    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-routing/main.go

Trong ví dụ số 2, thay vì sử dụng method Handle yêu cầu 3 tham số, ta sử dụng method Get để tạo các API xử lý GET request. Method Get nhận 2 tham số:

- Tên đường dẫn ("/" và "/khoa-hoc")

- Hàm xử lý request (homeHandlercourseHandler): Vẫn là 2 hàm nhận tham số đầu vào là một biến có kiểu dữ liệu iris.Context

Tương tự, ta có thể đăng kí các API để xử lý các POST, PUT, DELETE request: app.Post, app.Put, app.Delete

2. Đọc dữ liệu từ URL Path

Trong quá trình tạo các đường dẫn và đăng kí hàm xử lý các web request, ta rất hay gặp phải trường hợp cần lấy dữ liệu từ URL để tiếp tục xử lý logic, ví dụ: Lấy ID của 1 bài viết từ trong URL, sau đó query vào database để lấy ra các thông tin chi tiết về bài viết theo ID đó,  các thông tin lấy được từ database sẽ được đổ vào trong file HTML để trả về cho client

IRIS cung cấp 2 hàm: ctx.Params.Get("keyname") và ctx.URLParam("keyname") để lấy dữ liệu từ URL:

func courseDetailHandler(ctx iris.Context) {
	// Đọc dữ liệu từ URL path
	// /khoa-hoc/hoc-Go --> courseName = "hoc-Go"
	// /khoa-hoc/web --> courseName = "web"
	// /khoa-hoc/thuat-toan --> courseName = "thuat-toan"
	courseName := ctx.Params().Get("name")
	htmlString := fmt.Sprintf("Chi tiết khóa học: %s", courseName)
	ctx.HTML(htmlString)
}

func courseBeginnerHandler(ctx iris.Context) {
	ctx.HTML("Khóa học dành cho beginner")
}

func blogHandler(ctx iris.Context) {
	// Đọc dữ liệu từ query string parameter
	// /bai-viet?category=Mobile&keyword=ios&author=quynh
	//  --> category = "Mobile"
	//  --> keyword = "ios"
	//  --> author = "quynh"
	category := ctx.URLParam("category")
	keyword := ctx.URLParam("keyword")
	author := ctx.URLParam("author")

	htmlCategory := fmt.Sprintf("Bài viết thuộc danh mục: %s", category)
	htmlKeyword := fmt.Sprintf("Từ khóa tìm kiếm: %s", keyword)
	htmlAuthor := fmt.Sprintf("Tác giả bài viết: %s", author)
	
	ctx.HTML(htmlCategory)
	ctx.HTML(htmlKeyword)
	ctx.HTML(htmlAuthor)
}

// Xử lý các GET request gửi đến: /khoa-hoc/hoc-Go, /khoa-hoc/web, /khoa-hoc/thuat-toan, ...
app.Get("/khoa-hoc/{name}", courseDetailHandler)

// Xử lý GET request gửi đến: /khoa-hoc/beginner
// Không bị mâu thuẫn với API /khoa-hoc/{name} ở trên
app.Get("/khoa-hoc/beginner", courseBeginnerHandler)

// Xử lý GET request gửi đến: /bai-viet và đọc dữ liệu trong query string parameter
app.Get("/bai-viet", blogHandler)

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

3. Gom nhóm các route

Nhiều URL có thể được gom nhóm lại với nhau, ví dụ 2 URL /users/profile và /users/dashboard đều dùng để lấy thông tin liên quan đến user, 2 URL có thể được gom nhóm lại như sau:

func userProfileHandler(ctx iris.Context) {
	ctx.HTML("Trang profile người dùng") 
} 

func userDashboardHandler(ctx iris.Context) { 
    ctx.HTML("Trang dashboard người dùng") 
} 

app.PartyFunc("/users", func(users iris.Party) { 
    // http://localhost:8080/users/profile 
    users.Get("/profile", userProfileHandler) 
    
    // http://localhost:8080/users/dashboard 
    users.Get("/dashboard", userDashboardHandler) 
})

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

Trên đây là một số ví dụ về cách điều hướng và tạo các hàm xử lý web request trong IRIS Framework. Ở bài viết sau, ta sẽ nói về middleware và cách tạo các middleware trong IRIS

Nguồn tham khảo:

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


Sau đây tiếp tục là 1 phút dành cho quảng cáo :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