2012-09-02 182 views
3

我對Go很新,所以我很抱歉如果這是一個微不足道的問題。帶有嵌套參數的POST請求

我目前正在嘗試編寫一個函數,該函數使用嵌套參數哈希創建POST請求。因此,在動態語言的等價的調用如javascript是:

$.post('http://example.com', {level1: {level2: 'foo'}}); 

在我去的代碼,我現在有嵌套以下列方式哈希:

func (runner *Runner) post(args... interface{}) interface{} { 
    form_url := getString(args[0]) 
    form_data := ??? 

    http.PostForm(form_url, form_data) 

實際類型爲表單數據(接口{})由第三方庫提供,所以我不能真正改變它。

的問題是PostForm預計,表單數據url.Values類型,這是定義爲

type Values map[string][]string 

什麼是最好的處理呢?我的結論到目前爲止,我需要編寫,將HTTP編碼嵌套哈希和具有以下簽名的函數:

func httpEncodeNestedMap(data interface{}) map[string][]string {...} 

什麼是圍棋的慣用實現這一點?

謝謝。

回答

4

基本上,在HTTP中沒有參數本身的「嵌套」。某些系統提供了一些工具來以模擬維度的方式解析查詢字符串。

例如,PHP支持[] -notation。在PHP中,你可以有一個查詢字符串像foo[bar]=baz&foo[zar]=boo這將轉化爲一個$_REQUEST結構是這樣的:

array(
    'foo' => array(
     'bar' => 'baz', 
     'zar' => 'boo' 
    ) 
) 

標準去庫沒有正當理由提供這樣的功能。你可以自己實現它。

什麼Go支持和PHP不(至少不是「本機」)是查詢參數的多個值。

type Values map[string][]string 

請注意如何使用任何參數名稱(字符串索引)可以有多個值(字符串切片)。這occurrs當你的查詢字符串看起來像foo=bar&foo=zar,那麼你會得到:

map[string][]string { 
    "foo": { 
     "bar", 
     "zar" 
    } 
} 

我希望這將清除的東西了。