golang中来自http请求的表单变量的嵌套值

时间:2018-07-15 21:23:11

标签: http go

我来自PHP背景,正在尝试学习Go。

过去,我可以从bash运行以下命令:

curl -X POST http://192.168.12.107/restfulendpoint.php -H "Content-Type: application/x-www-form-urlencoded" -d "menu[0][name]=pizza&menu[0][price]=12.00&menu[1][name]=orange juice&menu[1][price]=1.00"

我的restfulendpoint.php自然会收到一个POST数组,该数组的结构像这样的嵌套格式

Array
(
    [menu] => Array
        (
            [0] => Array
                (
                    [name] => pizza
                    [price] => 12.00
                )

            [1] => Array
                (
                    [name] => orange juice
                    [price] => 1.00
                )

        )

)

然后我创建了一个go脚本,希望可以产生类似的行为。我写了这个restfulendpoint.go

func Post(w http.ResponseWriter, r *http.Request) {
  url := mux.Vars(r)
  r.ParseForm()
  qs := r.Form
  log.Println(qs)
}

但是当我收到POST内容时,我得到的结构是这样的:

map[menu[0][price]:[12.00] menu[1][name]:[orange juice] menu[1][price]:[1.00] menu[0][name]:[pizza]]

Go将每个map[<int>][price|name]视为地图中的单独键。我真正想要的是这样的输出:

map[menu:[map[name:pizza price:12.00] map[name:pizza price:12.00]]]

在对curl的{​​{1}}调用中应该遵循一个约定,以便在每个菜单项都具有name和price属性的情况下,我自然可以在模式中接收数据吗?还是我应该在go脚本中做一些事情来保存数据模式?

1 个答案:

答案 0 :(得分:2)

go的ParseForm似乎无法满足您用来编码分层结构的格式。我认为您面对的是要么原始读取主体,然后自己对其进行解析,或者,如果您可以更改帖子格式,则只需将主体作为JSON而不是表单发送即可。