美文网首页
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