以下是一个使用 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,
	})
}

代码说明:

  1. main.go
    • 使用 Gin 框架创建路由并处理请求。
    • 定义中间件,获取请求头的 Authorization 值,并调用外部 API http://api.k.com/v2/p/ 获取数据。
    • 从外部 API 返回的 JSON 数据中提取用户名称,并将其存储在请求上下文中的 username 键值对中。
    • 定义 /api/balance 路由,并使用 userController.getBalance 处理请求。
  2. user.go
    • 定义 User 和 Balance 结构体,用于数据库模型映射。
    • getBalance 方法获取请求上下文中的 username,并根据用户名称查询数据库中的余额信息。
    • 返回包含用户名称、余额和记录的 JSON 数据。

代码亮点:

  • 使用 Gin 框架创建 API 接口,简洁易用。
  • 使用中间件处理请求头部信息,并调用外部 API 获取数据。
  • 使用 MVC 架构,将逻辑代码和数据访问代码分离,提高代码可读性和可维护性。
  • 使用 JSON 格式进行数据传输,方便前后端交互。

注意:

  • 请根据实际情况修改数据库连接信息和外部 API 地址。
  • 确保数据库中已存在 User 和 Balance 表,且已定义相关字段。
  • 确保外部 API http://api.k.com/v2/p/ 可访问,并返回包含用户名称的 JSON 数据。
  • 本示例仅供参考,实际应用中可能需要根据具体需求进行调整。

运行方法:

  1. 将代码保存到 main.gouser.go 文件中。
  2. 确保已安装 Go 语言和 Gin 框架。
  3. 在命令行中执行 go run main.go 运行程序。
  4. 使用浏览器访问 http://localhost:8080/api/balance 即可获取数据。
Golang Gin 框架 MVC 架构 API 开发:从外部 API 获取数据并查询数据库

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

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