使用 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 进行安全性和性能优化。
Golang Gin 框架 MVC 架构 API 示例:使用 GORM 查询数据库

原文地址: https://www.cveoy.top/t/topic/m6qL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录