以下是一个使用golang的gin框架遵循MVC写的API示例:

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,
	})
}
使用golang的gin框架遵循MVC写一个API被请求时将被请求时携带authorization的值取出并向apikcomv2p请求需要在authorization携带先前取出的值返回值是一个json数据取出datauserusername的值然后查询数据库balance表的user中和前面返回值中username相同的数据最后返回json格式的包含该user数据中所有usermoneyreco

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

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