GO語言gin框架實戰(zhàn)-01-基本使用

1. 定義路由服務(wù)

我們寫一個簡單的K8S示例來做完整示例:

package router

import (
    "github.com/gin-gonic/gin"
)

func Server()  {
    r := gin.Default()
    //創(chuàng)建一個groupV1組,里邊放一個檢查存活的接口
    groupV1 := r.Group("/api/v1")
    {
        groupV1.GET("/ping", Ping)
    }
    //在創(chuàng)建一個deployment組,來放置deployment的操作相關(guān)接口
    deployment := r.Group("/api/v1/deployment")
    {
        deployment.GET("/list",GetDeploymentList)
        deployment.GET("/",GetDeployment)
        deployment.DELETE("/",DeleteDeployment)
        deployment.POST("/",CreateDeployment)
        deployment.PUT("/image",ApplyDeploymentByImage)
        deployment.PUT("/replicas",ApplyDeploymentByReplicas)
    }
    //啟動服務(wù),如果不寫端口,默認8080
    r.Run(":1840") 
}

2. 定義headers函數(shù)

2.1 Get方法

Query(Params方式)

  • 參數(shù)接收示例
deploymentName := c.Query("deployment_name")
  • 完整代碼示例
func GetDeployment(c *gin.Context)  {
    namespaceName := c.Query("namespace_name")
    deploymentName := c.Query("deployment_name")
    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    deploymentInfo,err := service.GetDeployment(clientSet,namespaceName,deploymentName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    fmt.Printf("%+v\n",deploymentInfo)
    c.JSON(200,deploymentInfo)
}

說明:(c *gin.Context)必須要傳入

  • postman調(diào)用


    image.png

2.2 Post方法

BindJSON (Body=>raw=>JSON)

  • 定義結(jié)構(gòu)體如下
type DeploymentQueryParams struct {
    NamespaceName string `json:"namespace_name"`
    DeploymentName string `json:"deployment_name"`
    ImageName string `json:"image_name"`
    PortNum int32 `json:"port_num"`
    Replica int32 `json:"replica"`
}
  • 參數(shù)接收示例
err := c.BindJSON(&deploymentQueryParams)
  • 代碼完整示例
func CreateDeployment(c *gin.Context)  {
    var deploymentQueryParams service.DeploymentQueryParams
    //傳參綁定結(jié)構(gòu)體
   err := c.BindJSON(&deploymentQueryParams)
   if err !=nil{
        c.JSON(400, gin.H{"error": err.Error()})
        return
   }

    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    deploymentInfo,err := service.CreateSimpleDeployment(clientSet,deploymentQueryParams)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    fmt.Printf("%+v\n",deploymentInfo)
    c.JSON(200,deploymentInfo)
}
  • postman調(diào)用


    image.png

PostForm(Body=>form-data)

  • 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
  • 完整示例

參見2.3 PUT方法中"PostForm(Body=>form-data)" 部分。

2.3 PUT方法

BindJSON (Body=>raw=>JSON)

  • 參數(shù)接收示例
err := BindJSON(&deploymentQueryParams)
  • 完整代碼示例
func ApplyDeploymentByImage(c *gin.Context)  {
    var deploymentQueryParams service.DeploymentQueryParams
    c.BindJSON(&deploymentQueryParams)

    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    deploymentInfo,err := service.ApplyDeploymentByImage(clientSet,deploymentQueryParams.NamespaceName,deploymentQueryParams.DeploymentName,deploymentQueryParams.ImageName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    fmt.Printf("%+v\n",deploymentInfo)
    c.JSON(200,deploymentInfo)
}
  • postman 調(diào)用


    image.png

PostForm(Body=>form-data)

  • 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
  • 完整示例

修改一下上例(BindJSON)

func ApplyDeploymentByImageA(c *gin.Context)  {
    namespaceName := c.PostForm("namespace_name")
    deploymentName := c.PostForm("deployment_name")
    imageName := c.PostForm("image_name")
    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    deploymentInfo,err := service.ApplyDeploymentByImage(clientSet,namespaceName,deploymentName,imageName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    
    fmt.Printf("%+v\n",deploymentInfo)
    c.JSON(200,deploymentInfo)
}

2.4 DELETE方法

Query(Params方式)

  • 參數(shù)接收示例
deploymentName := c.Query("deployment_name")
  • 完整示例
func DeleteDeployment(c *gin.Context)  {
    namespaceName := c.Query("namespace_name")
    deploymentName := c.Query("deployment_name")
    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    err = service.DeleteDeployment(clientSet,namespaceName,deploymentName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }else {
        c.JSON(200,"刪除成功")
    }
}
  • postman 調(diào)用


    image.png

PostForm(Body=>form-data)

  • 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
  • 完整示例
func DeleteDeployment(c *gin.Context)  {
    namespaceName := c.PostForm("namespace_name")
    deploymentName := c.PostForm("deployment_name")
    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    err = service.DeleteDeployment(clientSet,namespaceName,deploymentName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }else {
        c.JSON(200,"刪除成功")
    }
}

Param (Path)

因為我們在k8s這個場景下不能一下定位到需要操作的資源,因此并不合適使用該方式,所以就不寫完整示例了,只寫一個樣例:

  • 路由設(shè)置
deployment.PUT("/:uuid",DeleteDeploymentA)
  • 參數(shù)接收示例
uuid := c.Param("uuid")

3. main函數(shù)調(diào)用路由服務(wù)

func main() {
    router.Server()
}

4. 數(shù)據(jù)返回和錯誤處理

  • 返回數(shù)據(jù)
c.JSON(200,deploymentInfo)
  • 錯誤處理
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
  • 示例

見 “2. 定義headers函數(shù)”中各示例均可看到:

func GetDeployment(c *gin.Context)  {
    namespaceName := c.Query("namespace_name")
    deploymentName := c.Query("deployment_name")
    clientSet,err := service.ConnectK8s()
    if err !=nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    deploymentInfo,err := service.GetDeployment(clientSet,namespaceName,deploymentName)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    fmt.Printf("%+v\n",deploymentInfo)
    c.JSON(200,deploymentInfo)
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容