带有嵌套参数的POST请求

时间:2012-09-02 22:23:20

标签: http go

我是Go的新手,所以如果这是一个微不足道的问题我会道歉。

我目前正在尝试编写一个使用嵌套参数哈希创建POST请求的函数。因此,javascript等动态语言中的等效调用将是:

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

在我的Go代码中,我目前使用以下方式嵌套哈希:

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

    http.PostForm(form_url, form_data)

表单数据(interface {})的实际类型由第三方库提供,因此我无法真正更改它。

问题是PostForm期望表单数据的url.Values类型,定义为

type Values map[string][]string

最好的处理方法是什么?到目前为止,我的结论是,我需要编写一个函数,对HTTP嵌套哈希进行编码并具有以下签名:

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

Go中的惯用实现是什么?

感谢。

1 个答案:

答案 0 :(得分:4)

基本上,在HTTP中,参数本身没有“嵌套”。有些系统提供了以模拟维度的方式解析查询字符串的工具。

例如,PHP支持[] - 表示法。在PHP中,您可以使用foo[bar]=baz&foo[zar]=boo之类的查询字符串,它将转换为$_REQUEST结构,如下所示:

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

标准Go库出于正当理由不提供此类功能。你可以自己实现它。

Go支持什么,PHP不支持(至少不是“natively”)是查询参数的多个值。

type Values map[string][]string

注意任何参数名称(字符串索引)可以有多个值(字符串切片)。当您的查询字符串看起来像foo=bar&foo=zar时,会发生这种情况,然后您会得到:

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

我希望这能解决问题。