1. 程式人生 > 其它 >[gin]資料解析和繫結

[gin]資料解析和繫結

前言

  • go version: 1.18

本文主要包含JSON、Form、Uri、XML的資料解析與繫結。

JSON資料解析與繫結

  • go程式碼
package main

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

// 定義接收JSON資料的結構體
type Login struct {
    Username string `form:"username" json:"username" uri:"username" xml:"username" binding:"required"`
    Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func f1(c *gin.Context){
    var json Login
    // 將資料解析到結構體中
    if err := c.ShouldBindJSON(&json); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": json.Username,
        "Password": json.Password,
    })
}

func main() {
	r := gin.Default()
    v1 := r.Group("/v1")
    {
        v1.POST("/loginjson", f1)
    }

	r.Run("192.168.0.10:8001")
}
  • curl 測試
curl -X POST \
-H 'Content-type:application/json' \
-d '{"username":"zhangsan","password": "qwerty"}' \
http://192.168.0.10:8001/v1/loginjson
  • python - requests測試
import json
import requests

data_json = {
    "username": "zhangsan",
    "password": "123456",
}

url = "http://192.168.0.10:8001/v1/loginjson"

resp = requests.post(url, data = json.dumps(data_json))
print(resp.text)

表單資料解析與繫結

  • go程式碼
func f2(c *gin.Context){
    var form Login
    // 將資料解析到結構體中
    if err := c.Bind(&form); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": form.Username,
        "Password": form.Password,
    })
}

v1.POST("loginform", f2)
  • python - requests測試
import requests

data = {
    "username": "zhangsan",
    "password": "123456",
}

url = "http://192.168.0.10:8001/v1/loginform"

resp = requests.post(url, data = data)
print(resp.text)
  • curl測試
curl -d "username=zhangsan&password=qwerty" \
http://192.168.0.10:8001/v1/loginform

URI資料解析與繫結

  • go程式碼
func f3(c *gin.Context){
    // uri資料解析與繫結
    var uri Login
    // 將資料解析到結構體中
    if err := c.ShouldBindUri(&uri); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": uri.Username,
        "Password": uri.Password,
    })
}

v1.GET("/loginuri/:username/:password", f3)
  • curl 測試
curl 'http://192.168.0.10:8001/v1/loginuri/zhangsan/asdfgh'

XML資料解析與繫結

  • go程式碼
func f4(c *gin.Context){
    // xml資料解析與繫結
    var xml Login
    // 將資料解析到結構體中
    if err := c.ShouldBindXML(&xml); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": xml.Username,
        "Password": xml.Password,
    })
}

v1.POST("/loginxml", f4)
  • python - requests 測試
import requests

data_xml = """
<?xml version="1.0" encoding="utf-8"?>
<server>
<username>lisi</username>
<password>123456</password>
</server>
"""

url = "http://192.168.0.10:8001/v1/loginxml"

resp = requests.post(url, data = data_xml)
print(resp.text)

參考

附錄 - 完整go示例程式碼

package main

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

// 定義接收JSON資料的結構體
type Login struct {
    Username string `form:"username" json:"username" uri:"username" xml:"username" binding:"required"`
    Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func f1(c *gin.Context){
    // JSON資料解析與繫結
    var json Login
    // 將資料解析到結構體中
    if err := c.ShouldBindJSON(&json); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": json.Username,
        "Password": json.Password,
    })
}

func f2(c *gin.Context){
    // 表單資料解析與繫結
    var form Login
    // 將資料解析到結構體中
    if err := c.Bind(&form); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": form.Username,
        "Password": form.Password,
    })
}

func f3(c *gin.Context){
    // uri資料解析與繫結
    var uri Login
    // 將資料解析到結構體中
    if err := c.ShouldBindUri(&uri); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": uri.Username,
        "Password": uri.Password,
    })
}

func f4(c *gin.Context){
    // xml資料解析與繫結
    var xml Login
    // 將資料解析到結構體中
    if err := c.ShouldBindXML(&xml); err != nil {
        // 返回錯誤資訊
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "Username": xml.Username,
        "Password": xml.Password,
    })
}


func main() {
	r := gin.Default()
    v1 := r.Group("/v1")
    {
        v1.POST("/loginjson", f1)
        v1.POST("/loginform", f2)
        v1.GET("/loginuri/:username/:password", f3)
        v1.POST("/loginxml", f4)
    }

	r.Run("192.168.0.10:8001")
}