Dưới đây là các bước tạo một ứng dụng RESTful API đơn giản với Go, sử dụng Framework Gin, GORM và database MySQL. Ứng dụng gồm các chức năng đơn giản:

  • Đăng ký
  • Đăng nhập
  • Chỉnh sửa Profile

Cấu trúc thư mục dự án

Tạo thư mục simple-restful-app cấu trúc như sau:

Cài đặt thư viện cho dự án

Chạy lệnh sau trong terminal mở tại thư mục dự án:

go mod init simple-restful-app

go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/drivermysql

Source code

File model/user.go:

package model

type User struct {
    ID       uint   `gorm:"primaryKey" json:"id"`
    Name     string `json:"name"`
    Email    string `json:"email"`
    Password string `json:"password"`
}
File database/db.go:
package database

import (
    "fmt"
    "simple-restful-app/model"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var DB *gorm.DB

func Connect() {
    dsn := "root:ducphat1708@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("Could not connect to the database" + err.Error())
    }
    fmt.Println("Connected to the database successfully")
    DB = db
}

func Migrate() {
    DB.AutoMigrate(&model.User{})
}

File controller/user_controller.go:

package controller

import (
    "simple-restful-app/database"
    "simple-restful-app/model"
    "net/http"
    "strconv"
    "github.com/gin-gonic/gin"
)

func Register(c *gin.Context) {
    var user model.User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := database.DB.Create(&user).Error; err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "Email đã tồn tại"})
        return
    }
    c.JSON(http.StatusCreated, user)
}

func Login(c *gin.Context) {
    var input model.User
    var user model.User
    if err := c.ShouldBindJSON(&input); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    if err := database.DB.Where("email = ? AND password = ?", input.Email, input.Password).First(&user).Error; err != nil {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "Sai email hoặc mật khẩu"})
        return
    }
    c.JSON(http.StatusOK, gin.H{"message": "Đăng nhập thành công", "user": user})
}

func UpdateUser(c *gin.Context) {
    id := c.Param("id")
    userID, _ := strconv.Atoi(id)
    var user model.User
    if err := database.DB.First(&user, userID).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "Người dùng không tồn tại"})
        return
    }
    var input model.User
    if err := c.ShouldBindJSON(&input); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    user.Name = input.Name
    user.Email = input.Email
    user.Password = input.Password

    database.DB.Save(&user)
    c.JSON(http.StatusOK, user)
}

File main.go:

package main

import (
    "simple-restful-app/database"
    "simple-restful-app/controller"
    "github.com/gin-gonic/gin"
)

func main() {
    // Khởi tạo database và migrate
    database.Connect()
    database.Migrate()
    r := gin.Default()
    r.POST("/register", controller.Register)
    r.POST("/login", controller.Login)
    r.PUT("/user/:id", controller.UpdateUser)
    r.Run(":8080")
}

để chạy dự án, sử dụng lệnh:

go run main.go
hoặc sử dụng công cụ Run & Debug trong IDE

Test APi với Postman

Test POST /register: http://localhost:8080/register

Test POST /login: http://localhost:8080/login
Test PUT /user/1: http://localhost:8080/user/1

About the Author

Đức Phát

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

Blockchain

Blockchain là gì? Blockchain là một công nghệ sổ cái phân tán (distributed ledger) lưu trữ dữ liệu dưới dạng các khối (blocks) được liên kết với nhau theo chuỗi (chain) bằng các hàm băm mật mã (cryptographic hash). Mỗi khối chứa danh sách các giao dịch, dấu thời gian, và tham chiếu đến khối […]

Computer Graphics

1. Ray Tracing Là một kỹ thuật mô phỏng ánh sáng trong đồ họa máy tính nhằm tạo ra hình ảnh cực kỳ chân thực. Phương pháp này dựa trên việc mô phỏng hành trình của các tia sáng từ mắt người (camera) đi vào không gian 3D, và tính toán cách chúng tương tác […]

Tìm hiểu RabbitMQ

RabbitMQ là gì? RabbitMQ là một message broker, triển khai giao thức AMQP (Advanced Message Queuing Protocol). Nhiệm vụ chính là tiếp nhận, lưu trữ tạm thời và chuyể n tiếp message giữa các Producer (gửi) và Consumer (nhận). Mục đích sử dụng RabbitMQ: phân tách các thành phần khác nhau trong hệ thống, xử […]

So sánh GORM vs go-pg vs Bun

Cộng đồng GORM Là ORM phổ biến nhất trong cộng đồng Go. Có nhiều tài liệu, ví dụ, StackOverflow câu trả lời, và nhiều package hỗ trợ mở rộng. Nhiều developer đã từng dùng Gorm. go-pg Từng rất phổ biến khi chỉ dùng PostgreSQL, nhưng đang bị Bun thay thế dần. Ít được duy trì […]

Sử dụng Request/Response trong ứng dụng RESTful mô hình MVC

DTO là gì? DTO (Data Transfer Object) là một object trung gian dùng để truyền dữ liệu giữa client – server hoặc giữa các service trong ứng dụng web/API theo kiến trúc RESTful API. DTO chỉ chứa các thông tin cần thiết mà client hoặc service khác cần (ví dụ: Login Form chỉ cần thông […]

Docker

Docker là gì? Docker là một nền tảng mã nguồn mở cho phép bạn đóng gói, phân phối và chạy ứng dụng bên trong các “container” – những môi trường ảo nhẹ, cô lập nhưng vẫn chia sẻ nhân hệ điều hành của máy chủ. Khái niệm then chốt ở đây là “containerization”: thay vì […]