源码
input里的Param和Query
// Param returns router param by a given key.
func (input *BeegoInput) Param(key string) string {
for i, v := range input.pnames {
if v == key && i <= len(input.pvalues) {
return input.pvalues[i]
}
}
return ""
}
// Query returns input data item string by a given string.
func (input *BeegoInput) Query(key string) string {
if val := input.Param(key); val != "" {
return val
}
if input.Context.Request.Form == nil {
input.Context.Request.ParseForm()
}
return input.Context.Request.Form.Get(key)
}
可以看出,Query
的结果是先去找Param
,如果没有再去找Form
,Form
是Request
里的一个字段,类型是 url.Values
举例
代码1
routers/router.go
func init() {
beego.Router("/:id", &controllers.MainController{}, "*:Test")
}
controllers/default.go
func (c *MainController) Test() {
result := make(map[string]string)
result["param id"] = c.Ctx.Input.Param(":id")
result["query id"] = c.Ctx.Input.Query("id")
c.Data["json"] = result
c.ServeJSON()
}
效果:
➜ ~ curl -XGET http://127.0.0.1:10080/12\?id\=34
{
"param id": "12",
"query id": "34"
}
代码2
把传进Query的参数从id
改成:id
,即
...
result["query id"] = c.Ctx.Input.Query(":id")
...
效果:
➜ ~ curl -XGET http://127.0.0.1:10080/12\?id\=34
{
"param id": "12",
"query id": "12"
}
也就是上面源码里看出来的,Query
会先去Param
那里找,找到了即返回,所以会和Param
一样;找不到再去Form
里取。
总结
- URL(Uniform Resource Locator,统一资源定位符)的语法是:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
- 要想获取Param信息,即使用
c.Ctx.Input.Param(key)
- beego的router里,需要指定可以提取的Param的变量,用
:
开头,所以key
也是需要以:
开头 - 要想获取Query信息,即使用
c.Ctx.Input.Query(key)
- 正常情况下,Query的key不应当以
:
开头,以免和Param里的key冲突
如果冲突的话,Query(key)将变成Param(key),而不再是期望的值了
参考文档:
网友评论