使用 Go 來寫一個 Repository Restful API 的留言板
前言
這篇是我看到這篇文章
https://github.com/880831ian/go-restful-api-repository-messageboard?tab=readme-ov-file
跟著實作練習的紀錄,是使用 Go 來寫一個 Repository Restful API 的留言板,並且會使用 gin 以及 gorm (使用 Mysql)套件。
另外有加入 docker-compose設定跟mysql 連線調整。
開發環境
Go
GIN框架
Mysql
Docker
檔案結構
1 | . |
資料夾個別功能與作用:
sql:放置連線資料庫檔案。
controller:商用邏輯控制。
model:定義資料表資料型態。
repository:處理與資料庫進行交握。
router:設定網站網址路由。
設定 go.mod
到開發資料夾底下
1 | cd message_board |
初始化設定 go.mod 的 module
1 | go mod init message |
接著使用 go get 來引入 gin、gorm、mysql、yaml 套件
1 | $ go get -u github.com/gin-gonic/gin |
main.go
1 | package main |
引入我們 Repository 架構,將 config、model、router 導入,先測試是否可以連線資料庫,使用 AutoMigrate 來新增資料表(如果沒有才新增),或是使用 Table 來連線已有資料表,註冊網址路由,最後啟動專案,我們將 Port 設定成 8082。
sql 設定
connect.yaml
1 | host: 127.0.0.1 |
我們把 mysql 連線的資訊寫在此處。 (專案正式環境可能要加入gitignore 比較安全)
sql.go (下面為一個檔案,但長度有點長,分開說明)
1 | package sql |
import 會使用到的套件。
1 | var Connect *gorm.DB |
設定資料庫連線的 conf 來讀取 yaml 檔案。
1 | //初始化連線資料庫 |
初始化資料庫,會把剛剛讀取 yaml 的 conf 串接成可以連接資料庫的 url ,最後連線資料庫。
路由設定
router.go
1 | package router |
設定路由,版本 v1 網址是 api/v1 ,分別是新增留言、查詢全部留言、查詢 {id} 留言、修改 {id} 留言、刪除 {id} 留言,連接到不同的 controller function 。
資料表設定
model.go
1 | package model |
設定資料表的結構,使用 gorm.Model 預設裡面會包含 CreatedAt 和 UpdatedAt 和 DeletedAt 欄位。
controller 設定
controller.go
(下面為一個檔案,但長度有點長,分開說明)
1 | package controller |
import 會使用到的套件。
查詢留言功能
1 | func GetAll(c *gin.Context) { |
GetAll() 會使用到 repository.GetAllMessage() 查詢並回傳顯示查詢的資料。
c.Param(“id”) 是網址讀入後的 id,網址是http://127.0.0.1:8081/api/v1/message/{id} ,將輸入的 id 透過 repository.GetMessage() 查詢並回傳顯示查詢的資料。
新增留言功能
1 | func Create(c *gin.Context) { |
使用 Gin 框架中的 Bind 函數,可以將 url 的查詢參數 query parameter,http 的 Header、body 中提交的數據給取出,透過 repository.CreateMessage() 將要新增的資料帶入,如果失敗就顯示 http.StatusBadRequest,如果成功就顯示 http.StatusCreated 以及新增的資料。
修改留言功能
1 | func Update(c *gin.Context) { |
先使用 repository.GetMessage() 以及 c.Param(“id”) 來查詢此 id 是否存在,再帶入要修改的 Content ,透過 repository.UpdateMessage() 將資料修改,,如果失敗就顯示 http.StatusNotFound 以及找不到留言,如果成功就顯示 http.StatusOK 以及修改的資料。
刪除留言功能
1 | func Delete(c *gin.Context) { |
透過 repository.DeleteMessage() 將資料刪除,如果失敗就顯示 http.StatusNotFound 以及找不到留言,如果成功就顯示 http.StatusNoContent。
repository.go
(下面為一個檔案,但長度有點長,分開說明)
所有的邏輯判斷都要在 controller 處理,所以 repository.go 就單純對資料庫就 CRUD:
1 | package repository |
import 會使用到的套件。
查詢留言資料讀取
1 | //查詢全部留言 |
新增留言資料讀取
1 | //新增留言 |
修改留言資料讀取
1 | //更新 {id} 留言 |
刪除留言資料讀取
1 | //刪除 {id} 留言 |
Mysql docker-compose 設定
因為我在實作時發現沒有做 mysql server的設定,我這邊作了以下調整
Dockerfile
1 | # 使用 Go 官方映像作為基礎映像 |
docker-compose.yml
1 | version: "2.1" |
這邊設定了 phpmyadmin跟 mysql 服務,另外有一個go-app 的服務運行這個專案
啟用docker-compose
1 | docker-compose up -d |
運行結果
phpmyadmin連線
Postman 測試
查詢全部留言 - 成功(無資料)
查詢全部留言 - 成功(有資料)
查詢{id}留言 - 成功
查詢{id}留言 - 失敗
新增留言 - 成功
修改{id}留言 - 成功
刪除{id}留言 - 成功
執行結果
練習結果Repo
https://github.com/gahgah147/go-restful-api-repository-messageboard
測試postmain 內容 export
1 | { |
加入Container 內容持久化設定
1 | volumes: |
在 yaml 中新增 Volumes,Volumes 會將資料存放於 Container 之外,範例中就是會把資料存放於 db_data 這個資料夾
1 | db: |
設定container之間的連線
加入network設定
1 | networks: |
並調整 docker-compose 檔案
1 | version: "2.1" |
調整 connect.yaml
1 | host: db |
這邊設定 db連線到db這個 container
專案練習 Repo
https://github.com/gahgah147/go-restful-api-repository-messageboard
參考資料
https://github.com/880831ian/go-restful-api-repository-messageboard?tab=readme-ov-file