前言
- 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") }