zoukankan      html  css  js  c++  java
  • beego: 获取request参数

    beego提供了一套web开发的框架。但我们在开发过程中遇到了一些问题,现汇总如下。

    测试1:测试只有keys数组的情况

    func (this *TestController) Index() {
    keys := make([]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    fmt.Println(keys, len(keys))
    }

    测试结果:

    url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test

    结果:[] 0

    反复测试多次,结果相同

    测试2:测试有keys数组还有vals数组的情况

    func (this *TestController) Index() {
    keys := make([]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    
    var vals map[]string
    vals = make(map[]string, 0)
    this.Ctx.Input.Bind(&vals, "vals")
    
    fmt.Println(keys, vals, len(keys), len(vals)) 
    }

    测试结果:

    url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&vals[]=test&vals[]=test

    [] [] 0 0

    多次测试,结果相同

    测试3:测试有keys数组,有test字符串

    func (this *TestController) Index() {
    var test string
    this.Ctx.Input.Bind(&test, "test")
    fmt.Println(test)
    
    keys := make([]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    fmt.Println(keys, len(keys))
    }

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test

    输出:gotest:reflect.Set: value of type int is not assignable to type string

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=

    输出:gotest:reflect.Set: value of type int is not assignable to type string

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=test

    输出:

    test
    [test test] 2

    测试4:有keys数组,有test字符串,用GetString来获取test

    func (this *TestController) Index() {
    var test string
    test = this.GetString("test")
    fmt.Println(test)
    
    keys := make([]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    fmt.Println(keys, len(keys))
    }

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&test=test

    结果:

    test
    [test test] 2

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test

    结果:


    [test test] 2

    进一步测试

    测试4

    func (this *TestController) Index() {
    var test string
    test = this.GetString("test")
    fmt.Println(test)
    
    keys := make([]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    fmt.Println(keys, len(keys))
    }

    接下来的测试不会设置test,输出结果也不包含test的输出

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test

    输出:[test test] 2

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=

    输出:[test ] 2

    测试url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test

    输出:[test test] 2

    测试url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=

    输出:gotest:reflect.Set: value of type int is not assignable to type string

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&keys[0]=test&keys[1]=test

    输出:[test test test test] 4

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=test&keys[0]=test&keys[1]=test&keys[2]=

    输出:gotest:reflect.Set: value of type int is not assignable to type string

    测试url:http://api.query.qihoo.net:8090/test/index?keys[]=test&keys[]=&keys[0]=test&keys[1]=test&keys[2]=test

    输出:[test test test test ] 5

    测试结果显示:

    使用beego框架,想要获取数组必须具备几个条件

    1,必须有非数组的变量存在(string可以,其它类型int-bool等的没做测试),如果没有单个变量只有数组(不论是单个数组或者多个数组)则所有的数组获均取不到元素;

    2,如果url是keys[1]=test&keys[2]=test这样的,一定得保证每个项都要有值,不能为空,也就是不能存在keys[1]=这样的项

    注意事项

    非数组的单个变量如果不确定的话,最好用GetString,GetString不论该变量是否在url中被设置都能正常工作。如果用Bind,一定要保证该变量是有值的,否则报错

    允许这样的url:keys[]=test&keys[]=,不允许keys[2]这样的url:keys[0]=test&keys[1]=test&keys[2]=

    实际开发中:

    1,注意事项1非常有用,我们可以用一行代码完成:var _ = this.GetString("test")

    2,php的http_huild_query处理后的url是进行了urlencode编码,而且数组是带下标的(类似于keys[0]=1&keys[1]=2),从0开始编号。大部分工作正常,在值为空字符串是会有问题(keys[0]=test&keys[1]=test&keys[2]=),我们如何处理这部分情况呢?如下实验给出了结论:用map[string]string而不是[]string

    继续做实验。

    实验5:

    func (this *TestController) Index() {
    var _= this.GetString("test")
    
    var keys map[string]string
    keys = make(map[string]string, 0)
    this.Ctx.Input.Bind(&keys, "keys")
    fmt.Println(keys, len(keys))
    }

    测试url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=test

    结果:map[0:test 1:test 2:test] 3

    测试url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=

    结果:map[0:test 1:test 2:] 3

    测试url:http://api.query.qihoo.net:8090/test/index?keys[0]=test&keys[1]=test&keys[2]=test&keys[]=100

    结果:map[0:test 1:test 2:test :100] 4

    我们看到用map[string]string来代替[]string能够解决报错的问题,同时也有局限:不再兼容keys[]这样的数组元素。

    所以区分两种不兼容的使用场景,只能取其中一种用:1,数组元素全部用keys[],并且不允许任意一个keys[]有空值,可用[]string的Bind;2,数组元素全部用keys[0],keys[1],keys[2],允许有空值,map[string]string的Bind,如果要用数组而不是map,需要手工转化。

  • 相关阅读:
    轻松自动化---selenium-webdriver(python) (八)
    Ubuntu 18.04 LTS 启用 WakeOnLAN
    lower_bound 和 upper_bound
    [LeetCode 201.] Bitwise AND of Numbers Range
    [LeetCode 162.] Find Peak Element
    [LeetCode 33. 81. 153. 154.] 旋转数组中的二分查找
    C++ unordered_map 的一个疑问
    [LintCode 386.] 最多有k个不同字符的最长子字符串
    [LintCode 550.] 最常使用的K个单词II
    [LintCode 1029.] 寻找最便宜的航行旅途(最多经过k个中转站)
  • 原文地址:https://www.cnblogs.com/helww/p/4127258.html
Copyright © 2011-2022 走看看