使用 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
}
使用 Golang Gin 框架实现 MVC 模式 API,获取授权信息并查询数据库余额

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

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