文章目录
- Gin之获取querystring参数
- 1.querystring参数介绍
- 2.任意参数访问网页
- 3.获取一个querystring参数(Query方法)
- 4.获取一个querystring参数(DefaultQuery方法)
- 4.获取一个querystring参数(GetQuery方法)
- 5.获取二个querystring参数(Query方法)
- 6.获取二个querystring参数(Query方法)
- 7.获取多个querystring参数(ShouldBind方法)
- 8.获取多个querystring参数(ShouldBind方法)(binding tag)
- 9.获取多个querystring参数(Bind方法)(嵌套结构体)
- 10.获取多个querystring参数(QueryMap方法)
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请求的时候
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()
}
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,
})
})
}
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()
}
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()
}
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()
}
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()
}
7.获取多个querystring参数(ShouldBind方法)
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()
}
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()
}
第一种:
第二种:
第三种:
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()
}
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")
}