使用 Golang Gin 框架实现 MVC 模式 API,获取授权信息并查询数据库余额
使用 Golang Gin 框架遵循 MVC 写一个 API,被请求时将被请求时携带 authorization 的值取出并向 api.k.com/v2/p/ 请求, 需要在 authorization 携带先前取出的值,从返回值取出 json 数据 data 中 user 中 username 的值,这里的数据库处于已连接状态,不需要写出连接语句,然后在 MVC 的 models 中查询数据库 balance 表的 user 中和前面返回值中 username 相同的数据,最后返回 json 格式的包含该 user 数据中所有 user, money, record 值
以下是一个简单的实现,仅供参考:
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/xxx/models"
"github.com/xxx/services"
)
func main() {
r := gin.Default()
// 路由
r.GET("/api/balance", func(c *gin.Context) {
// 解析 Authorization 头
auth := c.GetHeader("Authorization")
if auth == "" {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"message": "Authorization header is missing"})
return
}
// 请求 api.k.com/v2/p/
data, err := services.GetDataFromAPI(auth)
if err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to get data from API"})
return
}
// 从返回值中获取 username
username, err := services.GetUsernameFromData(data)
if err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to get username from data"})
return
}
// 查询数据库
balance, err := models.GetBalanceByUsername(username)
if err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to get balance from database"})
return
}
// 返回 JSON 格式的数据
c.JSON(http.StatusOK, gin.H{"user": balance.Username, "money": balance.Money, "record": balance.Record})
})
r.Run(":8080")
}
services/data.go
package services
import (
"encoding/json"
"io/ioutil"
"net/http"
)
// 从 api.k.com/v2/p/ 获取数据
func GetDataFromAPI(auth string) ([]byte, error) {
url := "http://api.k.com/v2/p/"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", auth)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
// 从返回值中获取 username
func GetUsernameFromData(data []byte) (string, error) {
var result map[string]interface{}
err := json.Unmarshal(data, &result)
if err != nil {
return "", err
}
user, ok := result["user"].(map[string]interface{})
if !ok {
return "", err
}
username, ok := user["username"].(string)
if !ok {
return "", err
}
return username, nil
}
models/balance.go
package models
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type Balance struct {
Username string `json:"username"`
Money int `json:"money"`
Record int `json:"record"`
}
// 查询数据库中指定 username 的余额信息
func GetBalanceByUsername(username string) (*Balance, error) {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")
if err != nil {
return nil, err
}
defer db.Close()
stmt, err := db.Prepare("SELECT username, money, record FROM balance WHERE username = ?")
if err != nil {
return nil, err
}
defer stmt.Close()
row := stmt.QueryRow(username)
balance := &Balance{}
err = row.Scan(&balance.Username, &balance.Money, &balance.Record)
if err != nil {
return nil, err
}
return balance, nil
}
原文地址: https://www.cveoy.top/t/topic/m55n 著作权归作者所有。请勿转载和采集!