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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM