Gin之获取querystring参数

Gin之获取querystring参数

注:本文基于Windos系统上Go SDK v1.17.5、github.com/gin-gonic/gin v1.7.7依赖进行讲解

1.querystring参数介绍

在搜狗的搜索框里搜索杨超越后,地址栏里会出现https://www.sogou.com/web?query=杨超越,通常使用?前面的来表示请求的url,?后面的都是querystring参数,通常是key-value格式(xxx=yyy),query是查询的意思
注意:querystring通常都用在get请求的时候

image-20220204150300800
image-20220204150325357

2.任意参数访问网页

package main

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

func main() {
	r := gin.Default()
	r.GET("/web", func(c *gin.Context) {
		//获取浏览器那边发请求携带的querystrig参数
		c.JSON(http.StatusOK, "OK")
	})
	r.Run()
}

image-20220204160404314
image-20220204160454452
image-20220204160511222

3.获取一个querystring参数(Query方法)

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main() {
	r := gin.Default()
	r.GET("/web", func(c *gin.Context) {
		//获取浏览器那边发请求携带的querystrig参数的第一种方法
		//Query函数是*Context的方法,参数是(key string),返回值是 string
		name := c.Query("query") //通过Query获取请求中携带的querystring参数
		c.JSON(http.StatusOK, gin.H{
			"name": name,
		})
	})           
}

image-20220204161936488
image-20220204161917017
image-20220204162003781
image-20220204163303009
image-20220204163346277
image-20220204163430036

4.获取一个querystring参数(DefaultQuery方法)

package main

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

func main() {
	r := gin.Default()
	r.GET("/web", func(c *gin.Context) {
		//获取浏览器那边发请求携带的querystrig参数的第二种方法
		//DefaultQuery是*Context的方法,参数是(key, defaultValue string) ,返回值是string
		//DefaultQuery是查询这个query词的时候,如果能查到,就用查到的这个;查不到就有个默认值
		name := c.DefaultQuery("query", "somebody")
		c.JSON(http.StatusOK, gin.H{
			"name": name,
		})
	})
	r.Run()
}

image-20220204162657522
image-20220204162642917
image-20220204162848214
image-20220204162910547
image-20220204162931822

4.获取一个querystring参数(GetQuery方法)

package main

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

func main() {
	r := gin.Default()
	r.GET("/web", func(c *gin.Context) {
		//获取浏览器那边发请求携带的querystrig参数的第三种方法
		//GetQuery是*Context的方法,参数是(key string) ,返回值是(string, bool)
		name, ok := c.GetQuery("query") //取不到的时候会返回一个false
		if !ok {
			//取不到
			name = "somebody"
		}
		c.JSON(http.StatusOK, gin.H{
			"name": name,
		})
	})
	r.Run()
}

image-20220204165846560
image-20220204165815589
image-20220204165830230

5.获取二个querystring参数(Query方法)

func main() {
	r := gin.Default()
	r.GET("/web", func(c *gin.Context) {
		name := c.Query("query")
		age := c.Query("age")
		c.JSON(http.StatusOK, gin.H{
			"name": name,
			"age":  age,
		})
	})
	r.Run()
}

image-20220204170629677
image-20220204170538552
image-20220204170649074
image-20220204170711609

6.获取二个querystring参数(Query方法)

package main

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

type UserInfo struct {
	username string
	password string
}

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.Prinf("%#v\n", u)
		c.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})

	})

	r.Run()
}

image-20220205085950532

image-20220205092215780

7.获取多个querystring参数(ShouldBind方法)

image-20220211164050222

package main

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

//为了证明结构体里写的与用户传来的参数对应且一致,需要写tag
type UserInfo struct {
	Username string `form:"username"`
	Password string `form:"password"`
}

func main() {
	r := gin.Default()
	r.GET("/user", func(c *gin.Context) {
		var u UserInfo
		err := c.ShouldBind(&u) //注意在传入u,需要传入地址,否则传进去的是副本;而且UserInfo结构体内的字段一定要是大写的
		if err != nil {
			//返回一个400状态码,表示请求是有问题的
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		} else {
			fmt.Printf("%#v\n", u)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}
	})
	r.Run()
}

image-20220205094445218

image-20220205094432034

image-20220211192124919

image-20220211192217572

image-20220211192243015

8.获取多个querystring参数(ShouldBind方法)(binding tag)

package main

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

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

func main() {
	r := gin.Default()
	r.GET("/user", func(c *gin.Context) {
		var u UserInfo

		err := c.ShouldBind(&u)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		} else {
			fmt.Printf("%#v\n", u)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}
	})
	r.Run()
}

第一种:

image-20220211191815824

image-20220211191850600

第二种:

image-20220211191936357

第三种:

image-20220211192011962

9.获取多个querystring参数(Bind方法)(嵌套结构体)

type StructA struct {
    FieldA string `form:"field_a"`
}

type StructB struct {
    NestedStruct StructA
    FieldB string `form:"field_b"`
}

type StructC struct {
    NestedStructPointer *StructA
    FieldC string `form:"field_c"`
}

type StructD struct {
    NestedAnonyStruct struct {
        FieldX string `form:"field_x"`
    }
    FieldD string `form:"field_d"`
}

func GetDataB(c *gin.Context) {
    var b StructB
    c.Bind(&b)
    c.JSON(200, gin.H{
        "a": b.NestedStruct,
        "b": b.FieldB,
    })
}

func GetDataC(c *gin.Context) {
    var b StructC
    c.Bind(&b)
    c.JSON(200, gin.H{
        "a": b.NestedStructPointer,
        "c": b.FieldC,
    })
}

func GetDataD(c *gin.Context) {
    var b StructD
    c.Bind(&b)
    c.JSON(200, gin.H{
        "x": b.NestedAnonyStruct,
        "d": b.FieldD,
    })
}

func main() {
    r := gin.Default()
    r.GET("/getb", GetDataB)
    r.GET("/getc", GetDataC)
    r.GET("/getd", GetDataD)

    r.Run()
}

image-20220211161153621

image-20220211161344808

10.获取多个querystring参数(QueryMap方法)

package main

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

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

	router.GET("/post", func(c *gin.Context) {
		ids := c.QueryMap("ids")
		c.JSON(200, gin.H{
			"AAA": ids,
		})
	})
	router.Run(":8080")
}

image-20220211225211830

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值