beego: 獲取request參數

beego提供了一套web開發的框架。但咱們在開發過程當中遇到了一些問題,現彙總以下。php

測試1:測試只有keys數組的狀況web

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

測試結果:api

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

結果:[] 0框架

反覆測試屢次,結果相同測試

測試2:測試有keys數組還有vals數組的狀況ui

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)) 
}

測試結果:this

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

[] [] 0 0url

屢次測試,結果相同

測試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,須要手工轉化。

相關文章
相關標籤/搜索