2017-10-04 106 views
0
A := 123 
B := "xyz" 
b := bytes.NewBufferString("a=" + A + "&b=" + B) 
r.Body = ioutil.NopCloser(b) 

是否有在POST請求之前設置變量ab一個更好的方式發送?設置POST請求的表單數據的變量

+0

你的意思是說更好? – noel

+0

@shakabra避免字符串操作 – exebook

+0

你不操縱字符串,你只需要一個字符串字面值。你的意思是不必指定編碼形式的值? – icza

回答

3

形式鍵和值中的某些字符需要轉義,例如&=。所以爲了避免這些錯誤,最好使用url.Values類型。

它將string鍵映射到string值的列表。因此,如果您的值不是string,則必須先將其轉換爲string。最簡單的方法是使用fmt.Sprint()strconv.Itoa()(更多選項請參閱Golang: format a string without printing?)。

vs := url.Values{} 
vs.Set("a", fmt.Sprint(123)) 
vs.Set("b", "xyz") 
vs.Set("tricky", "= & =") 
b := bytes.NewBufferString(vs.Encode()) 

url.Values知道如何正確地轉義鍵和值。上述vs.Encode()例如輸出(嘗試在Go Playground):

a=123&b=xyz&tricky=%3D+%26+%3D 

注:

由於url.Values只是一個地圖(與map[string][]string作爲其基本型),你也可以使用一個簡單的composite literal創建和填充它:

vs := url.Values{ 
    "a":  {strconv.Itoa(123)}, 
    "b":  {"xyz"}, 
    "tricky": {"= & ="}, 
} 
b := bytes.NewBufferString(vs.Encode()) 

嘗試在Go Playground這個變體。