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,需要手工转化。

beego: 获取request参数的更多相关文章

  1. 获取request参数的工具类

    package cn.edu.hactcm.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...

  2. 使用JS获取request参数

    1.document.write('<%=request.getAttribute("param")%>'); 2.window.navigator.userAgent ...

  3. springMVC 获取request参数

    持续补充............ GET 常用的:@PathVariable  @RequestParam   request.getParameter POST 常用的:@ResponseBody  ...

  4. request 获取请求参数

    /** * 根据request获取请求的用户参数 * @return * @return */ protected <T> T getParamConvertEntity(Class cl ...

  5. golang web框架 beego 学习 (三) beego获取参数

    直接上常用的例子吧: A:     获取URL中的参数 router func init() { beego.Router("/task/?:id/?:name", &co ...

  6. beego——获取参数

    1.获取参数 我们经常需要获取用户传递的数据,包括Get.POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据: GetString(key string) string ...

  7. 使用JavaScript获取Request中参数的值

    本人很少写博客,有不正确的地方还希望大家多多指导. 假设现在有一个URL,如下. http://www.jacky.com/?id=1101&name=jacky 如何通过JS访问到id和na ...

  8. request对象常用API 获取请求参数的值 request应用 MVC设计模式

    1 request对象常用API   1)表示web浏览器向web服务端的请求   2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1     ...

  9. java获取request中的参数、java解析URL问号后的参数

    java获取request中的参数.java解析URL问号后的参数.有时候我们需要从request中获取参数,或者获取拼接在Url后面的参数,有时候一个一个去拿有点麻烦,一起拿出来放在一个map里面需 ...

随机推荐

  1. Android 6.0动态添加权限

    Android 6.0加入了动态权限,权限有普通权限和危险权限两种,其中危险权限在6.0以上的手机是需要动态添加权限的,举例:拨打10086//-----------------布局文件------- ...

  2. Faster-R-CNN编译使用及相应问题解决

    1.首先opencv是需要安装的,我用的ubuntu14.04,opencv3.0,具体安装教程可以参考网上很多,不想多提. 2.安装几个依赖包:cython,python-opencv和easydi ...

  3. 你我公益模式系统APP开发

    你我公益模式系统APP开发(微or电 158.1500.1390 小凡团队)你我公益系统开发,你我公益系统模式定制,你我公益系统开发软件,你我公益平台系统开发. 互联网世界无边无界,互联网创业者应敢于 ...

  4. javascript中关于继承的理解

    首先,你要理解在javascript中,每当一个新函数创建时,都会生成一个prototype属性,我们管它叫做原型对象.看一个例子: function foo(){ this.name='qiangq ...

  5. 第五十四节,socketserver通讯模块实现并发操作,真多线程并发

    socketserver通讯模块实现并发操作,基于select.epoll.socket.多线程,实现的正真多线程多并发 socketserver通讯模块底层调用的socket模块,只是它作了处理基于 ...

  6. 【Shell】Linux中分区脚本

    后天要中期答辩了,今天只刷了一个题,还没写出来,但是想更新博客,所以只有把之前写的东西贴出来了. 一个用于分区的shell脚本 1 #!/bin/bash #指定脚本解释器路径 2 echo &quo ...

  7. deque (STL)

    //双端队列 //deque的成员函数 c.assign(beg, end); //将[beg, end]区间中的数据赋值给c c.assign(n, elem); //将n个elem的拷贝赋值给c ...

  8. intellij中javax包的导入

    新建intellij的maven web想项目的时候,出现的问题,import javax.servlet.http相关的包出错 好久不搭建也好久没用intellij了,都忘了,在这里笔记一下 再次吐 ...

  9. android Tweened Animations

    Android提供了两种类型的动画: 一类是Tween动画:提供了旋转.移动.伸展和淡出等效果: 第二类是Frame-by-frame动画:这一类Animations可以创建一个Drawable序列, ...

  10. java的静态方法的使用

    静态的方法和属性,你可以这么理解,就是所有对象公用的,比如一个属性是这样定义的: private static String name; 那么他的意思就是说,因为他是静态的,我所有的对象的name属性 ...