Gin(一) 获取前端请求参数

获取前端请求参数

1. 获取 URL (query)参数

querystring指的是URL中?后面携带的参数,例如:/user/search?username=zhangsan&address=北京。 获取请求的query参数的方法如下:

URL 参数可以通过DefaultQuery()Query() 两个参数获取

// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {
	// 如果指定的key 没有对应的值就使用默认值
	username1 := ctx.DefaultQuery("username", "lisi")

	// 根据key 获取值
	username2 := ctx.Query("username")

	address := ctx.Query("address")
    
    // 返回JSON 字符串
	ctx.JSON(http.StatusOK, gin.H{
		"message":   "ok",
		"username1": username1,
		"username2": username2,
		"address":   address,
	})
}
func main() {

	// 创建默认路由
	r := gin.Default()

	// 绑定路由规则
	r.GET("/user/search", urlQueryHandle)

	// 监听端口
	r.Run(":9000")
}

? 后没有传值(使用默认值)
在这里插入图片描述
? 后携带值

在这里插入图片描述

2. 获取 Form参数

  • 表单提交POST请求时,http常见的传输格式有四种

    • application/json (json格式)
    • text/plain (text格式)
    • application/x-www-form-urlencode(表单默认提交格式)
    • application./xml (xml格式)
    • multipart/form-data( 文件上传)
  • 可以通过 DefaultPostForm()PostForm() 两个方法获取(默认解析的是 x-www-form-urlencode 和 form-data 格式的参数)

当前端请求的数据通过form表单提交时,例如向/user/search发送一个POST请求,获取请求数据的方式如下:

// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {

	// 获取不到值时就是用默认值
	username1 := ctx.DefaultPostForm("username", "lisi")

	username2 := ctx.PostForm("username")
	address := ctx.PostForm("address")

	// 以Json 字符串的形式返回
	ctx.JSON(http.StatusOK, gin.H{
		"message":   "ok",
		"username1": username1,
		"username2": username2,
		"address":   address,
	})
}
func main() {
	// 创建路由
	r := gin.Default()

	// 绑定路由规则
	r.POST("/user/search", formParamsHandle)

	// 监听端口
	r.Run(":9000")
}

表单中没有我们想要的值(使用默认值)
在这里插入图片描述
表单中有我们想要的值
在这里插入图片描述

3. 获取Json 参数

当前端请求的数据通过JSON提交时,例如向/user/search发送一个POST请求,则获取请求参数的方式如下:

// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {

	// 获取request.Body() 中的数据(这里没有进行错误处理)
	// 返回的是字节数组
	dataBytes, _ := ctx.GetRawData()

	// 定义一个map
	var m map[string]interface{}

	// 反序列化 别忘了&
	_ = json.Unmarshal(dataBytes, &m)

	// 数据返回
	ctx.JSON(http.StatusOK, m)

}

func main() {
	// 创建路由
	r := gin.Default()

	// 绑定路由规则
	r.POST("/user/search", paramsJsonHandle)

	// 监听端口
	r.Run(":9000")
}

ctx.GetRowData()

// GetRawData return stream data.
func (c *Context) GetRawData() ([]byte, error) {
	return ioutil.ReadAll(c.Request.Body)
}

在这里插入图片描述

4. 获取Path参数(RestFul风格)

请求的参数通过URL路径传递,例如:/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下。

// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {

	// 获取参数值
	username := ctx.Param("username")
	address := ctx.Param("address")

	// 数据返回
	ctx.JSON(http.StatusOK, gin.H{
		"message":  "ok",
		"username": username,
		"address":  address,
	})
}

func main() {

	// 1. 创建路由
	r := gin.Default()

	// 2. 绑定路由规则
	r.GET("/user/search/:username/:address", paramsPathHandle)

	// 监听端口
	r.Run(":9000")
}

在这里插入图片描述

通配符(会将通配符后面的路径都截取)

// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {

	// 获取参数值
	username := ctx.Param("username")
	address := ctx.Param("address")
	action := ctx.Param("action")

	// 数据返回
	ctx.JSON(http.StatusOK, gin.H{
		"message":  "ok",
		"username": username,
		"address":  address,
		"action": action,
	})
}

func main() {

	// 1. 创建路由
	r := gin.Default()

	// 2. 绑定路由规则
	r.GET("/user/search/:username/:address/*action", paramsPathHandle)

	// 监听端口
	r.Run(":9000")
}

在这里插入图片描述

注意: 多个通配符会报错

eg: /user/search/:username/:address/*action/*action2

在这里插入图片描述

5. 参数绑定

使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中

// 用户信息信息结构体
// 加上 binding:"required" 标签,说明该参数是必填的,如果不填就会报错
type UserInfo struct {
	Username string `json:"username" form:"username" binding:"required"`
	Address string `json:"address" form:"address" binding:"required"`
}

// 获取query参数
func queryHandle(ctx *gin.Context) {
	var userInfo UserInfo

	// 获取数据
	err := ctx.ShouldBind(&userInfo)
	if err == nil {
		ctx.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": userInfo.Username,
			"address":  userInfo.Address,
		})
	} else {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
	}
}

func jsonHandle(ctx *gin.Context) {
	var userInfo UserInfo

	// 获取数据
	err := ctx.ShouldBind(&userInfo)
	if err == nil {
		ctx.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": userInfo.Username,
			"address":  userInfo.Address,
		})
	} else {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
	}
}

func fromHandle(ctx *gin.Context) {
	var userInfo UserInfo

	// 获取数据
	err := ctx.ShouldBind(&userInfo)
	if err == nil {
		ctx.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": userInfo.Username,
			"address":  userInfo.Address,
		})
	} else {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
	}
}

func main() {

	// 创建路由
	r := gin.Default()

	// 绑定路由规则
	r.GET("/user/query", queryHandle)
	r.POST("/user/form", fromHandle)
	r.POST("/user/json", jsonHandle)

	// 监听端口
	r.Run(":9000")

}

url query参数解析
在这里插入图片描述
form表单参数解析
在这里插入图片描述
json 数据解析

在这里插入图片描述

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值