Tạo RESTful APIs với CRUD trong Gin Framework

Đ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
      replace crud => ../manipulate-with-database/crud-mysql/​
      đường dẫn ../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
  • Tạo tệp main.go
    touch main.go​
  • Tạo module controllers và tệp item-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