A := 123
B := "xyz"
b := bytes.NewBufferString("a=" + A + "&b=" + B)
r.Body = ioutil.NopCloser(b)
在发送a
请求之前,是否有更好的方法来设置变量b
和POST
?
答案 0 :(得分: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上尝试此变体。