2017-10-06 67 views
0

我目前Golang工作,我正在開發一個API,在後處理程序中,我需要接受早報形成陣列,但與命名的位置,我的意思是,像這樣的東西:從golang發表形式獲取動態數組

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' 

而且,事實上當我轉到打印表格值,我得到:

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

直到這裏,我明白了一切,然後我需要獲得陣列myarray在golang變量,我該怎麼做?當我這樣做:

req.Form["myarray"] 

我得到什麼也沒有,我的目的是爲了獲得該數組並將其存儲在數據庫中,由於我不知道哪些領域可以在陣列發送一個JSON對象。我需要這樣的東西:

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

,你有2個獨立的變量稱爲' 「myArray的[X]」'和'「myArray的[不是HTTP查詢參數工作中文別名]「'。你想把這些分析成地圖嗎? – JimB

+0

@JimB正確的,現在我讓他們爲兩個獨立的變量,但我需要他們以某種方式在一個陣列這樣的話,我可以把它轉換成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) 
}