[gin]資料解析和繫結
阿新 • • 發佈:2022-04-06
前言
- 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")
}