Golang Gin 框架 MVC 架构 API 示例:使用 GORM 查询数据库
使用 Golang 的 Gin 框架遵循 MVC 写一个 API
本示例展示了如何使用 Golang 的 Gin 框架,遵循 MVC 架构,写一个 API 来获取用户余额信息,并使用 GORM 查询数据库。
路由定义 (router/sys_balance.go):
package router
import (
"github.com/gin-gonic/gin"
"yourproject/controller"
)
func RegisterSysBalanceRouter(router *gin.RouterGroup) {
controller := controller.SysBalanceController{}
router.GET("/balance", controller.GetBalance)
}
控制器实现 (controller/sys_balance_controller.go):
package controller
import (
"encoding/json"
"net/http"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"yourproject/models"
)
type SysBalanceController struct{}
// 响应数据结构
type BalanceResponse struct {
User string `json:"user"`
Money float64 `json:"money"`
Record int `json:"record"`
RecordDate string `json:"record_date"`
Bot int `json:"bot"`
BotDate string `json:"bot_date"`
MRecord int `json:"m_record"`
MRecordDate string `json:"m_record_date"`
MRecordPkg string `json:"m_record_package"`
}
func (ctrl SysBalanceController) GetBalance(c *gin.Context) {
authorization := c.GetHeader("authorization")
if authorization == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"})
return
}
// 向 api.k.com/v2/p/ 发送请求
req, err := http.NewRequest("GET", "http://api.k.com/v2/p/", nil)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create request"})
return
}
req.Header.Set("authorization", authorization)
client := &http.Client{Timeout: time.Second * 10}
resp, err := client.Do(req)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to send request"})
return
}
defer resp.Body.Close()
// 解析响应 JSON
var respData map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&respData)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to parse response"})
return
}
user, ok := respData["data"].(map[string]interface{})["user"].(map[string]interface{})
if !ok {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to parse user data"})
return
}
username, ok := user["username"].(string)
if !ok {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to parse username"})
return
}
// 查询数据库
var balance models.Balance
result := models.Db.Where("user = ?", username).First(&balance)
if result.Error != nil && result.Error != gorm.ErrRecordNotFound {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to query database"})
return
}
if result.Error == gorm.ErrRecordNotFound {
c.JSON(http.StatusNotFound, gin.H{"error": "balance not found"})
return
}
// 构建响应对象
response := BalanceResponse{
User: balance.User,
Money: balance.Money,
Record: balance.Record,
RecordDate: balance.RecordDate.Format("2006-01-02"),
Bot: balance.Bot,
BotDate: balance.BotDate.Format("2006-01-02"),
MRecord: balance.MRecord,
MRecordDate: balance.MRecordDate.Format("2006-01-02"),
MRecordPkg: balance.MRecordPkg,
}
c.JSON(http.StatusOK, response)
}
模型定义 (models/balance.go):
package models
import "time"
// 余额模型
type Balance struct {
ID uint `gorm:"primary_key"`
User string
Money float64
Record int
RecordDate time.Time
Bot int
BotDate time.Time
MRecord int
MRecordDate time.Time
MRecordPkg string
}
func init() {
Db.AutoMigrate(&Balance{})
}
说明:
- 该 API 使用了 Gin 框架构建路由和控制器,并使用 GORM 查询数据库。
- 控制器从请求头中获取
authorization值,并将其用于向api.k.com/v2/p/发送请求。 - 从
api.k.com/v2/p/的响应中获取username值,并使用 GORM 查询balance表中与该username相同的数据。 - 返回包含用户余额信息的 JSON 数据。
注意:
- 该示例假设数据库已连接,并省略了连接语句。
- 需要根据实际情况修改数据库连接配置和模型定义。
- 在实际应用中,需要对 API 进行安全性和性能优化。
原文地址: https://www.cveoy.top/t/topic/m6qL 著作权归作者所有。请勿转载和采集!