Golang学习之网络参数请求-Query Params及Path Variables的区别及底层实现

2023年2月10日10:55:39

Golang学习之网络参数请求-Query Params及Path Variables的区别及底层实现

背景

后端向web页面请求参数时,通常会有两种方式,1、Query Params;2、Path Variables,他们的区别在哪里呢?

一、Query Params

顾名思义,请求参数。由前端通过k-v键值对的形式传入,其值并不是通过url本身获取,例如

http://localhost:8080/Local/user?userName="nick"&age=12

上述链接可以分两段来理解,前为路径,后为路径传入的参数

路径:http://localhost:8080/Local/user

参数:userName="nick",age=12

二、Path Variables

路径参数。直接在url中获取的参数,例如

http://localhost:8080/Local/user/nick

上述链接就是一条路径,变量nick通过路径获取

后端接口会表示为

http://localhost:8080/Local/user/:userName

Golang实现

在gin框架中,通过context.go封装了获取上述两种参数的方法,需通过Context结构体调用。

什么是Context

官方的说法是,Context是gin框架中最重要的部分,它使得我们可以在中间件中传递参数、管理数据流,验证JSON请求,渲染JSON返回流。其中封装了非常多的功能,详细阅读请查看源码或文档。

// Context is the most important part of gin. It allows us to pass variables between middleware,
// manage the flow, validate the JSON of a request and render a JSON response for example.

1、获取Query Params

提供了方法Query,gin中部分源码如下

// Query returns the keyed url query value if it exists,
// otherwise it returns an empty string `("")`.
// It is shortcut for `c.Request.URL.Query().Get(key)`
//     GET /path?id=1234&name=Manu&value=
// 	   c.Query("id") == "1234"
// 	   c.Query("name") == "Manu"
// 	   c.Query("value") == ""
// 	   c.Query("wtf") == ""
func (c *Context) Query(key string) string {
	value, _ := c.GetQuery(key)
	return value
}
//查看GetQury方法实现,底层通过map去接收参数,获取第一个参数值并返回
// 	   It is shortcut for `c.Request.URL.Query().Get(key)`
//     GET /?name=Manu&lastname=
//     ("Manu", true) == c.GetQuery("name")
//     ("", false) == c.GetQuery("id")
//     ("", true) == c.GetQuery("lastname")
func (c *Context) GetQuery(key string) (string, bool) {
	if values, ok := c.GetQueryArray(key); ok {
		return values[0], ok
	}
	return "", false
}

1、获取Path Variables

提供了方法Param

// Param returns the value of the URL param.
// It is a shortcut for c.Params.ByName(key)
//     router.GET("/user/:id", func(c *gin.Context) {
//         // a GET request to /user/john
//         id := c.Param("id") // id == "john"
//     })
func (c *Context) Param(key string) string {
	return c.Params.ByName(key)
}

//继续查看调用方法,使用Params结构体封装
// ByName returns the value of the first Param which key matches the given name.
// If no matching Param is found, an empty string is returned.
func (ps Params) ByName(name string) (va string) {
	va, _ = ps.Get(name)
	return
}

总结

1、从微观角度看,两者区别在于Path Variables通过slice获取,而Query Params通过map获取,关键点为是否构成k-v结构,所以当所请求参数为空值的时候,作为切片的Path Variables是无法成功获取参数的,而map可以通过例如"name"=""来接收参数,然后后台可以根据这个""继续处理后续接口。

2、从宏观角度看,两者在参数获取形式上有区别。Path Variables通过url获取,Query Params通过请求参数获取。

  • 作者:RazerZhang
  • 原文链接:https://blog.csdn.net/weixin_53970851/article/details/120520732
    更新时间:2023年2月10日10:55:39 ,共 2254 字。