2017-10-06 5 views
0

私は現在Golangで働いていますが、POSTハンドラでAPIを開発しています。投稿フォームで配列を受け取る必要がありますが、名前付きの位置では、次のようになります。golangから動的配列を取得する投稿フォーム

今はCLIでcurlを使用して投稿リクエストを作成しようとしています。私はすべてを理解ここまでは、その後、私は配列myarrayを取得する必要があり

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

:私は行くにフォームの値を印刷するとき確かに、私が得る、

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' 

そして:私はこれを送信していますgolang変数、どうしたらいいですか?私がないとき:

req.Form["myarray"] 

が、私はそこに何を取得、私の目的は、その配列を取得し、私はその配列に送信することができますどの分野かわからないことにより、データベースにJSONオブジェクトとして格納することです。あなたはそれを自分で解析することができる

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

HTTPクエリパラメータが動作しないことを、あなたは2と呼ばれる別の変数 ' "myarrayの[X]"'と[ '" myarrayのを持っていますotherName] "'それらをマップに解析しようとしていますか? – JimB

+0

@JimB正しい、今私は2つの別々の変数としてそれらを得ているが、私はそれを1つの配列に何らかの方法で必要とするので、それをjsonに変換して保存する –

+1

ここにはショートカットはありません、それらをマップに割り当てます。 json配列は文字列インデックスを持つことができないので、スライスを使うことができます(また、Goでは配列を必要としません)。 – JimB

答えて

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) 
} 
関連する問題