Golang Gin 框架 MVC 架构 API 开发:从外部 API 获取数据并查询数据库
以下是一个使用 Golang 的 Gin 框架遵循 MVC 架构写的 API 示例,该示例从外部 API 获取数据,提取用户名称,并根据用户名称查询数据库中的余额信息,最终返回 JSON 格式数据。
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type UserController struct {
DB *gorm.DB
}
func main() {
db, err := gorm.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test_db?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
db.AutoMigrate(&User{}, &Balance{})
userController := UserController{
DB: db,
}
r := gin.Default()
r.Use(func(c *gin.Context) {
auth := c.GetHeader("Authorization")
if auth == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
c.Abort()
return
}
resp, err := http.Get("http://api.k.com/v2/p/")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
c.Abort()
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get data from api.k.com"})
c.Abort()
return
}
var data map[string]interface{}
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
c.Abort()
return
}
username := data["data"].(map[string]interface{})["user"].(map[string]interface{})["username"].(string)
c.Set("username", username)
c.Next()
})
api := r.Group("/api")
{
api.GET("/balance", userController.getBalance)
}
r.Run(":8080")
}
user.go
package main
import (
"time"
"github.com/jinzhu/gorm"
)
type User struct {
gorm.Model
Username string `json:"username"`
Balance Balance
}
type Balance struct {
gorm.Model
UserID uint
User User `json:"-"`
Money float64
Record string
}
func (u *UserController) getBalance(c *gin.Context) {
username := c.GetString("username")
var user User
if err := u.DB.Where("username = ?", username).First(&user).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
var balance Balance
if err := u.DB.Where("user_id = ?", user.ID).First(&balance).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{
"user": balance.User.Username,
"money": balance.Money,
"record": balance.Record,
})
}
代码说明:
- main.go
- 使用 Gin 框架创建路由并处理请求。
- 定义中间件,获取请求头的 Authorization 值,并调用外部 API
http://api.k.com/v2/p/获取数据。 - 从外部 API 返回的 JSON 数据中提取用户名称,并将其存储在请求上下文中的
username键值对中。 - 定义
/api/balance路由,并使用userController.getBalance处理请求。
- user.go
- 定义 User 和 Balance 结构体,用于数据库模型映射。
getBalance方法获取请求上下文中的username,并根据用户名称查询数据库中的余额信息。- 返回包含用户名称、余额和记录的 JSON 数据。
代码亮点:
- 使用 Gin 框架创建 API 接口,简洁易用。
- 使用中间件处理请求头部信息,并调用外部 API 获取数据。
- 使用 MVC 架构,将逻辑代码和数据访问代码分离,提高代码可读性和可维护性。
- 使用 JSON 格式进行数据传输,方便前后端交互。
注意:
- 请根据实际情况修改数据库连接信息和外部 API 地址。
- 确保数据库中已存在 User 和 Balance 表,且已定义相关字段。
- 确保外部 API
http://api.k.com/v2/p/可访问,并返回包含用户名称的 JSON 数据。 - 本示例仅供参考,实际应用中可能需要根据具体需求进行调整。
运行方法:
- 将代码保存到
main.go和user.go文件中。 - 确保已安装 Go 语言和 Gin 框架。
- 在命令行中执行
go run main.go运行程序。 - 使用浏览器访问
http://localhost:8080/api/balance即可获取数据。
原文地址: https://www.cveoy.top/t/topic/m484 著作权归作者所有。请勿转载和采集!