复习

访问链接:

http://localhost:8080/user?username=user&password=itmxs

源码:

package main

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

func main()  {
	r:=gin.Default()
	r.GET("/user", func(c *gin.Context) {
		username:=c.Query("username")
		password:=c.Query("password")
		u:=UserInfo{
			username:username,
			password:password,
		}
		fmt.Printf("%#v\n",u)
		c.JSON(http.StatusOK,gin.H{
			"username" :username,
			"password":password,
			"message":"ok",
		})

	})
	r.Run()

}
type UserInfo struct {
	username string
	password string
}

参数绑定

为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryStringform表单JSONXML等参数到结构体中。 下面的示例代码演示了.ShouldBind()强大的功能,它能够基于请求自动提取JSONform表单QueryString类型的数据,并把值绑定到指定的结构体对象。

package main

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

func main()  {
	r:=gin.Default()
	r.LoadHTMLFiles("./index.html")//加载html页面
	r.GET("/user", func(c *gin.Context) {
		//username:=c.Query("username")
		//password:=c.Query("password")
		//u:=UserInfo{
		//	username:username,
		//	password:password,
		//}
		var u  UserInfo //声明一个UserInfo类型的结构体变量u
		err:=c.ShouldBind(&u)//值传递。所以相当于ctrl+v的v,原值不会改变
		if err !=nil{
			c.JSON(http.StatusBadRequest,gin.H{
				"err":err.Error(),
			})

		}else{
			fmt.Printf("%#v\n",u)
			c.JSON(http.StatusOK,gin.H{})

		}

		c.JSON(http.StatusOK,gin.H{
			//"username" :username,
			//"password":password,
			"message":"ok",
		})
		//get请求
		r.GET("/index", func(c *gin.Context) {
			//访问html页面
			c.HTML(http.StatusOK,"index.html",nil)

		})
		// 绑定form表单示例 (user=itmxs&password=123456)
		r.POST("/loginForm", func(c *gin.Context) {
			var login Login
			// ShouldBind()会根据请求的Content-Type自行选择绑定器
			if err := c.ShouldBind(&login); err == nil {
				c.JSON(http.StatusOK, gin.H{
					"user":     login.User,
					"password": login.Password,
				})
			} else {
				c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			}
		})


	})
	r.Run(":9999")

}
type UserInfo struct {
	Username string `form:"username"`
	Password string `form:"password"`
}
type Login struct {
	User     string `form:"user" json:"user" binding:"required"`
	Password string `form:"password" json:"password" binding:"required"`
}

02

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)
// Binding from JSON
type Login struct {
	User     string `form:"user" json:"user" binding:"required"`
	Password string `form:"password" json:"password" binding:"required"`
}

func main() {
	router := gin.Default()

	// 绑定JSON的示例 ({"user": "q1mi", "password": "123456"})
	router.POST("/loginJSON", func(c *gin.Context) {
		var login Login

		if err := c.ShouldBind(&login); err == nil {
			fmt.Printf("login info:%#v\n", login)
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// 绑定form表单示例 (user=q1mi&password=123456)
	router.POST("/loginForm", func(c *gin.Context) {
		var login Login
		// ShouldBind()会根据请求的Content-Type自行选择绑定器
		if err := c.ShouldBind(&login); err == nil {
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// 绑定QueryString示例 (/loginQuery?user=q1mi&password=123456)
	router.GET("/loginForm", func(c *gin.Context) {
		var login Login
		// ShouldBind()会根据请求的Content-Type自行选择绑定器
		if err := c.ShouldBind(&login); err == nil {
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// Listen and serve on 0.0.0.0:8080
	router.Run(":8080")
}

ShouldBind会按照下面的顺序解析请求中的数据完成绑定:

  1. 如果是 GET 请求,只使用 Form 绑定引擎(query)。
  2. 如果是 POST 请求,首先检查 content-type 是否为 JSONXML,然后再使用 Form(form-data)。