dongqidi2799 2017-10-04 09:20
浏览 42

设置POST请求表单数据变量

A := 123
B := "xyz"
b := bytes.NewBufferString("a=" + A + "&b=" + B)
r.Body = ioutil.NopCloser(b)

Is there a better way of setting variables a and b before the POST request is sent?

  • 写回答

1条回答 默认 最新

  • drxp993551 2017-10-04 10:00
    关注

    Certain characters in form keys and values need to be escaped, such as & or =. So to avoid those mistakes, best is to use the url.Values type.

    It maps string keys to list of string values. So if you have a value other than string, you have to convert it to string first. Easiest is to use fmt.Sprint() or strconv.Itoa() (for more options see 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 knows how to escape keys and values properly. The above vs.Encode() for example outputs (try it on the Go Playground):

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

    Note:

    As url.Values is just a map (with map[string][]string as its underlying type), you can also use a simple composite literal to create and populate it:

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

    Try this variant on the Go Playground.

    评论

报告相同问题?

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器