Golang Gin 框架 MVC API 示例:获取用户余额信息
使用 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.WithValue将authorization值传递给后续的请求,避免重复获取。 - 可以使用第三方库进行 JSON 数据的序列化和反序列化,例如
encoding/json或github.com/json-iterator/go。 - 可以使用缓存机制来提高 API 的响应速度。
- 可以使用日志记录来记录 API 的请求和响应信息。
其他注意事项:
- API 设计应遵循 RESTful API 的规范。
- API 文档应清晰易懂,方便开发者使用。
- API 安全性应得到保障,例如使用 HTTPS 进行通信、使用身份验证机制等。
原文地址: https://www.cveoy.top/t/topic/m6tG 著作权归作者所有。请勿转载和采集!