如何为Golang HTTP请求发送嵌套标头

时间:2018-06-26 19:49:01

标签: http go https http-headers

我在Ruby中有一个较旧的脚本,如下所示:

RestClient::Request.execute(
    url: "myurl",
    method: :put,
    headers: {
      params: {
        foo: 'bar'
      }
 })

这是我到目前为止在Golang中所拥有的:

req, _ := http.NewRequest("PUT", url, nil)
req.Header.Add("params", "{\"foo\": \"bar\"}")
client := &http.Client{}
rsp, err = client.Do(req)

这不起作用,但是我不确定该怎么办。我需要以不同的方式格式化该字符串吗?

请求的标头是:

map[Accept:[*/*] Accept-Encoding:[gzip, deflate] User-Agent:[rest-client/2.0.2 (my_pc x86_64) ruby/2.4.2p198] Content-Length:[0] Content-Type:[application/x-www-form-urlencoded]]

请求转储(使用httputil.DumpRequest)为:

PUT /my_path?foo=bar HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
User-Agent: rest-client/2.0.2 (my_pc) ruby/2.4.2p198

看起来我只需要将信息作为查询参数放在路径中即可。除非有其他事情我应该检查。内容长度为0,因此也没有正文。

1 个答案:

答案 0 :(得分:1)

我刚刚运行了您的Ruby代码,发现它实际上并没有发送任何标头,而是向您的请求添加了查询参数:

PUT /?foo=bar HTTP/1.1
Accept: */*; q=0.5, application/xml
Accept-Encoding: gzip, deflate
User-Agent: Ruby
Host: localhost:8080

因此,您只需使用以下代码即可在Go中复制它:

req, _ := http.NewRequest("PUT", url, strings.NewReader(`{"foo": "bar"}`))
client := &http.Client{}
rsp, err = client.Do(req)