Gin获取请求参数

231 阅读1分钟

Gin获取参数

Gin获取参数

表单提交,json提交以及Restful参数提交

package main

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


func main() {


	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {


			c.JSON(200, gin.H{
				"message": "pong",
				"data": nil,
			})


	})

	//获取querystring参数 也就是url?拼接的参数 /user/search?username=小王子
	r.GET("/user/search", func(c *gin.Context) {
		query1 := c.Query("username")
		query2 := c.DefaultQuery("username","")

		c.JSON(http.StatusOK, gin.H{
			"username1": query1,
			"username2": query2,
		})

	})



	//获取 提交表单数据
	r.POST("/user/login", func(c *gin.Context) {
		username := c.PostForm("username")
		pwd := c.PostForm("pwd")

		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"pwd": pwd,
		})

	})

	//POST 获取 提交的json数据
	r.POST("/user/postJson", func(c *gin.Context) {
		// 从c.Request.Body读取请求数据
		b, _ := c.GetRawData()
		// 定义map或结构体
		var m map[string]interface{}
		// 反序列化
		_ = json.Unmarshal(b, &m)

		c.JSON(http.StatusOK, m )
	})

	// Restful参数
	//获取path参数 类似java中的 @pathvariable 拿取url后的参数
	// http://127.0.0.1:9090/user/variable/root/北京
	r.GET("/user/variable/:username/:address", func(c *gin.Context) {
		username := c.Param("username")
		address := c.Param("address")


		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"address": address,
		})

	})


	// ————————————————————  反射获取各种参数 ————————————————————————————

	//ShouldBind会按照下面的顺序解析请求中的数据完成绑定:
	//
	//如果是 GET 请求,只使用 Form 绑定引擎(query)。
	//如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。

	//定义结构体以及tag
	type Login struct {
		User     string `form:"user" json:"user" binding:"required"`
		Password string `form:"password" json:"password" binding:"required"`
	}


	//获取 json数据
	r.POST("/api/json", func(c *gin.Context) {
		 var login Login
		if err := c.ShouldBind(&login); err == nil {
			fmt.Printf("请求的 login数据 : %#v\n", login)
			c.JSON(http.StatusOK, gin.H{
				"data":login,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}

	})


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

	// 绑定 url后拼接参数 示例 (/login ?user=tom&password=123456)
	r.GET("/api/loginForm", func(c *gin.Context) {
		var login Login
		// ShouldBind()会根据请求的Content-Type自行选择绑定器
		if err := c.ShouldBind(&login); err == nil {
			c.JSON(http.StatusOK, gin.H{
				"data":login,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})



	// ————————————————————  反射获取各种参数 ————————————————————————————


	r.Run(":9090") // 监听并在 0.0.0.0:9090 上启动服务
}