美文网首页
2018-09-13 beego中Query和Param的区别

2018-09-13 beego中Query和Param的区别

作者: 四火流年 | 来源:发表于2018-09-13 14:10 被阅读221次

源码

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,如果没有再去找FormFormRequest里的一个字段,类型是 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里取。

总结

  1. URL(Uniform Resource Locator,统一资源定位符)的语法是:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
  1. 要想获取Param信息,即使用c.Ctx.Input.Param(key)
  2. beego的router里,需要指定可以提取的Param的变量,用:开头,所以key也是需要以:开头
  3. 要想获取Query信息,即使用c.Ctx.Input.Query(key)
  4. 正常情况下,Query的key不应当以:开头,以免和Param里的key冲突
    如果冲突的话,Query(key)将变成Param(key),而不再是期望的值了

参考文档:

  1. https://blog.csdn.net/a976134036/article/details/78876191

相关文章

网友评论

      本文标题:2018-09-13 beego中Query和Param的区别

      本文链接:https://www.haomeiwen.com/subject/rvywgftx.html