使用 Golang Gin 框架遵循 MVC 写一个 API 获取用户余额信息

本示例演示了使用 Golang Gin 框架遵循 MVC 架构构建一个 API,该 API 获取用户余额信息。API 使用 GORM 查询数据库,并从外部 API 获取用户名称。

路由已经注册,跳过注册路由的步骤。

models/balance.go

package models

import (
    "time"
)

type Balance struct {
    ID           uint64     `gorm:"primary_key"`
    User         string     `gorm:"type:varchar(255);unique_index"`
    Money        float64    `gorm:"type:double"`
    Record       float64    `gorm:"type:double"`
    RecordDate   time.Time  `gorm:"type:datetime"`
    Bot          float64    `gorm:"type:double"`
    BotDate      time.Time  `gorm:"type:datetime"`
    MRecord      float64    `gorm:"type:double"`
    MRecordDate  time.Time  `gorm:"type:datetime"`
    MRecordPkg   string     `gorm:"type:text"`
    CreatedAt    time.Time  `gorm:"type:datetime"`
    UpdatedAt    time.Time  `gorm:"type:datetime"`
}

func (b *Balance) TableName() string {
    return "balance"
}

func GetBalanceByUsername(username string) (*Balance, error) {
    var balance Balance
    err := db.Where("user = ?", username).First(&balance).Error
    if err != nil {
        return nil, err
    }
    return &balance, nil
}

controllers/balance.go

package controllers

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/my/repo/models"
)

func GetBalance(c *gin.Context) {
    authorization := c.GetHeader("Authorization")
    if authorization == "" {
        c.JSON(http.StatusUnauthorized, gin.H{
            "message": "Missing Authorization header",
        })
        return
    }

    resp, err := http.Get("https://api.k.com/v2/p/")
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "message": err.Error(),
        })
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "message": err.Error(),
        })
        return
    }

    var data struct {
        User struct {
            Username string `json:"username"`
        } `json:"user"`
    }

    if err := json.Unmarshal(body, &data); err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "message": err.Error(),
        })
        return
    }

    balance, err := models.GetBalanceByUsername(data.User.Username)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "message": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "user":          balance.User,
        "money":         balance.Money,
        "record":        balance.Record,
        "record_date":   balance.RecordDate,
        "bot":           balance.Bot,
        "bot_date":      balance.BotDate,
        "m_record":      balance.MRecord,
        "m_record_date": balance.MRecordDate,
        "m_record_pkg":  balance.MRecordPkg,
    })
}

说明:

  • 此示例代码仅供参考,需要根据实际情况进行调整。
  • 代码中使用的外部 API 地址 https://api.k.com/v2/p/ 仅为示例,请替换为实际的 API 地址。
  • 代码中使用到的数据库连接信息 db 需在实际应用中进行配置。
  • 代码中未进行错误处理,实际应用中需要进行完善的错误处理。

优化建议:

  • 可以使用 context.WithValueauthorization 值传递给后续的请求,避免重复获取。
  • 可以使用第三方库进行 JSON 数据的序列化和反序列化,例如 encoding/jsongithub.com/json-iterator/go
  • 可以使用缓存机制来提高 API 的响应速度。
  • 可以使用日志记录来记录 API 的请求和响应信息。

其他注意事项:

  • API 设计应遵循 RESTful API 的规范。
  • API 文档应清晰易懂,方便开发者使用。
  • API 安全性应得到保障,例如使用 HTTPS 进行通信、使用身份验证机制等。
Golang Gin 框架 MVC API 示例:获取用户余额信息

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

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