从golang Post Form获取动态数组

时间:2017-10-06 14:53:44

标签: json go slice

我目前正在Golang工作,我正在开发一个API,在POST处理程序中我需要在Post表单中接收一个数组,但是有了命名位置,我的意思是这样的:

myarray[a]:"some Value"
myarray[otherName]: "some Other value"
myarray[x] : "something different"

现在我正在尝试使用CLI中的curl发布Post请求。我寄这个:

curl -i -X POST --url http://localhost:20000/myendpoint -H "Content-Type: application/x-www-form-urlencoded" -d 'Name=Comp&myarray[x]=somethingdifferent&myarray[otherName]=someOtherValue'

而且,当我在Go中打印表单值时,我得到:

[myarray[x]:[somethingdifferent] myarray[otherName]:[someOtherValue]]

直到这里我理解了一切,然后我需要在golang变量中获取数组myarray,我该怎么做?当我这样做时:

req.Form["myarray"]

我什么也得不到,我的目的是获取该数组并将其存储为数据库中的JSON对象,因为我不知道该数组中可以发送哪个字段。我需要这样的东西:

myarray[[x]=somethingdifferent,[otherName]=someOtherValue]

1 个答案:

答案 0 :(得分:1)

您可以自己解析:

func extractDynArray(form url.Values, key string) (result map[string]interface{}, err error) {
    result = make(map[string]interface{})
    reg, err := regexp.Compile(`^([a-z]+)\[([a-z]+)\]$`)
    if err != nil {
        log.Fatalf("Error compiling regexp: %v", err)
    }
    var matches [][]string
    for k, v := range form {
        matches = reg.FindAllStringSubmatch(k, -1)
        if len(matches) != 1 {
            continue
        }
        if key != "" && matches[0][1] != key {
            continue
        }
        if len(matches[0]) != 3 {
            continue
        }
        result[matches[0][2]] = v
    }
    return
}

func handler(w http.ResponseWriter, r *http.Request) {
    err := r.ParseForm()
    if err != nil {
        log.Fatalf("Cannot parse form %v", err)
    }
    //form := r.Form["myarray"]
    fmt.Printf("Form: %+v\n", r.Form)
    fmt.Printf("Form myarray: %+v \n", r.Form["myarray"])
    parsed, err := extractDynArray(r.Form, "myarray")
    fmt.Printf("Parsed: %v. Err: %v", parsed, err)
}