Golang Gin 框架 MVC API: 从外部 API 获取用户名并查询用户余额
Controllers/user.go
package controllers
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/xxx/balance/models"
"github.com/xxx/balance/utils"
)
func GetUserBalance(c *gin.Context) {
authHeader := c.GetHeader('Authorization')
if authHeader == '' {
c.JSON(http.StatusBadRequest, gin.H{'message': 'Authorization header is missing'})
return
}
data, err := utils.MakeRequestWithAuthHeader('GET', 'https://api.k.com/v2/p/', authHeader)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{'message': 'Failed to get user data from API'})
return
}
username, err := utils.GetUsernameFromData(data)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{'message': 'Failed to get username from API response'})
return
}
user, err := models.GetUserBalance(username)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{'message': 'Failed to get user balance from database'})
return
}
c.JSON(http.StatusOK, gin.H{
'user': user.User,
'money': user.Money,
'record': user.Record,
'record_date': user.RecordDate,
'bot': user.Bot,
'bot_date': user.BotDate,
'm_record': user.MRecord,
'm_record_date': user.MRecordDate,
'm_record_package': user.MRecordPackage,
})
}
Models/balance.go
package models
import (
"github.com/xxx/balance/db"
)
type UserBalance struct {
User string `json:"user"`
Money int `json:"money"`
Record int `json:"record"`
RecordDate string `json:"record_date"`
Bot int `json:"bot"`
BotDate string `json:"bot_date"`
MRecord int `json:"m_record"`
MRecordDate string `json:"m_record_date"`
MRecordPackage int `json:"m_record_package"`
}
func GetUserBalance(username string) (*UserBalance, error) {
var user UserBalance
err := db.Conn.QueryRow("SELECT user, money, record, record_date, bot, bot_date, m_record, m_record_date, m_record_package FROM balance WHERE user = ?", username).
Scan(&user.User, &user.Money, &user.Record, &user.RecordDate, &user.Bot, &user.BotDate, &user.MRecord, &user.MRecordDate, &user.MRecordPackage)
if err != nil {
return nil, err
}
return &user, nil
}
Utils/api.go
package utils
import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"
)
func MakeRequestWithAuthHeader(method, url, authHeader string) ([]byte, error) {
req, err := http.NewRequest(method, url, nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", authHeader)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
}
type UserApiResponse struct {
Data struct {
User struct {
Username string `json:"username"`
} `json:"user"`
} `json:"data"`
}
func GetUsernameFromData(data []byte) (string, error) {
var apiResponse UserApiResponse
err := json.Unmarshal(data, &apiResponse)
if err != nil {
return "", err
}
return apiResponse.Data.User.Username, nil
}
原文地址: https://www.cveoy.top/t/topic/m6zE 著作权归作者所有。请勿转载和采集!