Điều kiện cần
- Biết cài đặt môi trường phát triển và lập trình căn bản với Golang
- Biết cách tải các module khác của Golang về máy
- Biết cách tạo các module, package trong Golang
- Biết cách xây dựng RESTful APIs, các quy tắc căn bản để tạo RESTful APIs
- Biết làm việc với Gin-Gonic Framework
- Biết Thao tác CRUD trong Golang
Khởi tạo dự án
- Tạo thư mục chứa dự án
mkdir gin-api-crud cd gin-api-crud
- Tạo module của dự án
go mod init gin-api-crud
- Thêm module crud-mysql trong bài viết Thao tác CRUD trong Golang vào module vừa tạo
- Mở tệp
go.mod
- Thêm mã lệnh sau vào dòng cuối cùng trong tệp
go.mod
đường dẫnreplace crud => ../manipulate-with-database/crud-mysql/
../manipulate-with-database/crud-mysql/
là đường dẫn tương đối trỏ vào module đã viết mã lệnh trong bài viết Thao tác CRUD trong Golang
- Mở tệp
- Tạo tệp
main.go
touch main.go
- Tạo module
controllers
và tệpitem-controller.go
mkdir controllers cd ./item-controller touch item-controller.go
Viết mã lệnh cho dự án
item-controller.go
package controllers
import (
"crud/dal"
"crud/model"
"strconv"
"github.com/gin-gonic/gin"
)
//SetupItemRouter for item router
func SetupItemRouter(r *gin.Engine) {
//Create
r.POST("/item", func(c *gin.Context) {
var item model.Item
if err := c.ShouldBindJSON(&item); err == nil {
rowsAffected, lastInsertedId, err := dal.InsertItem(item)
if err != nil {
c.JSON(500, gin.H{
"messages": "Insert Item error",
})
} else {
if rowsAffected > 0 {
c.JSON(200, gin.H{
"messages": "Insert Item complete",
"itemId": lastInsertedId,
})
}
}
}
})
//Read
r.GET("/item/:id", func(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
item, err := dal.GetItem(id)
if err != nil {
c.JSON(500, gin.H{
"messages": "Item not found",
})
} else {
c.JSON(200, item)
}
})
//Update
r.PUT("/item", func(c *gin.Context) {
var item model.Item
if err := c.ShouldBindJSON(&item); err == nil {
rowsAffected, err := dal.UpdateItem(item)
if err != nil {
c.JSON(500, gin.H{
"messages": "update Item error",
})
} else {
if rowsAffected > 0 {
c.JSON(200, gin.H{
"messages": "update Item complete",
})
}
}
}
})
//Delete
r.DELETE("/item/:id", func(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
rowsDeletedAffected, err := dal.DeleteItem(id)
if err != nil {
c.JSON(500, gin.H{
"messages": "delete error.",
})
} else {
if rowsDeletedAffected > 0 {
c.JSON(200, gin.H{
"messages": "delete completed.",
})
}
}
})
}
main.go
package main
import (
"gin-api-crud/controllers"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
controllers.SetupItemRouter(r)
r.Run(":8080")
}
Biên dịch và chạy thử dự án
- Để chạy thử dự án bạn thực hiện lệnh sau:
go run main.go
- Để biên dịch và chạy dự án bạn thực hiện những lệnh sau:
go build ./gin-api-crud
Kiểm thử RESTful APIs với Postman
- Kiểm thử chức năng Cread
- Kiểm thử chức năng Read
- Kiểm thử chức năng Update
- Kiểm thử chức năng Delete
Kiểm tra với log của ứng dụng vừa chạy
Mã nguồn tham khảo theo liên kết sau: https://github.com/sinhdev/go-lang-demo/tree/main/gin-api-crud
Tài liệu tham khảo
https://godoc.org/github.com/gin-gonic/gin
https://github.com/gin-gonic
https://medium.com/@dinhhuy_67517/gin-framework-là-gì-49cfe86f29ad
https://medium.com/wesionary-team/getting-started-with-go-gin-framework-6943f8f5f882
https://medium.com/@dablu/our-first-microservice-in-golang-using-gin-gonic-as-framework-4db155e46fc6
https://dev.to/codehakase/building-a-web-app-with-go-gin-and-react-5ke