如何在POST数据包中添加HTTP标头?

时间:2013-09-11 15:09:47

标签: http http-headers go http-post

我正在尝试发送需要修改标头的POST请求。

这是我的代码:

    import (
      "net/http"
      "net/url"
      "fmt"
    )

    const API_URL = "https://api.site.com/api/"

    func SendOne(str string) {
      v := url.Values{}
      v.Add("source", "12345678")
      v.Add("text", str)

      client := &http.Client{nil, nil, nil}
      req, err := http.NewRequest("POST", API_URL, strings.NewReader(v.Encode()))

      if err != nil {
        fmt.Println(err)
      }

      req.Header.Add("Authorization", "123456")
      res, err := client.Do(req)
      if err != nil {
        fmt.Println(err)
      }
      defer res.Body.Close()
    }

我不知道为什么代码不起作用。任何线索?

提前致谢。


编辑:我忘了说我正在使用OAuth 2.0进行授权。

1 个答案:

答案 0 :(得分:3)

使用tcpdump,我们可以看到您粘贴的代码的请求标头和正文如下所示:

POST / HTTP/1.1
Host: example.com
User-Agent: Go 1.1 package http
Content-Length: 45
Authorization: 123456
Accept-Encoding: gzip

source=12345678&text=http%3A%2F%2Fexample.com

您在上面的评论中提到,如果添加Content-Type标题,则可以使用。执行相同的过程并转储两个对等方之间的通信:

POST / HTTP/1.1
Host: example.com
User-Agent: Go 1.1 package http
Content-Length: 45
Authorization: 123456
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip

source=12345678&text=http%3A%2F%2Fexample.com

除了现在包含提供的Content-Type标头之外,其与前一个有效负载完全相同。因此,就Go应用程序本身的行为而言,除了您明确告诉它要做的事情之外,没有什么特别的事情发生。

当您添加Content-Type标题时,它的工作原理必须是您正在与之交谈的实际服务器想知道content body you're providing is encoded的方式。