2

我正在尝试发送需要修改标头的 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 进行授权。

4

1 回答 1

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必须是您正在与之交谈的实际服务器想知道您提供的内容主体是如何编码的

于 2013-09-11T18:01:41.787 回答