使用golang的gin框架遵循MVC写一个API被请求时将被请求时携带authorization的值取出并向apikcomv2p请求需要在authorization携带先前取出的值返回值是一个json数据取出datauserusername的值然后查询数据库balance表的user中和前面返回值中username相同的数据最后返回json格式的包含该user数据中所有usermoneyreco
以下是一个使用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,
})
}
原文地址: https://www.cveoy.top/t/topic/bAWo 著作权归作者所有。请勿转载和采集!