【问题标题】:How to add HTTP Header in POST packet?如何在 POST 数据包中添加 HTTP 标头?
【发布时间】:2013-09-11 15:09:46
【问题描述】:

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

【问题讨论】:

  • 我在req.Header.Add("Authorization", "123456") 之前添加了reqest.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")。它有效。但我不知道为什么。
  • 如果我没记错的话,Authorization 是为 HTTP auth 保留的。您如何验证您的请求无效?任何到达服务器的示例数据以及它的外观?
  • @nemo 我忘了提到我正在使用 OAuth 2.0 进行 HTTP 身份验证。我将数据发布到网站,但它返回代码 400。

标签: http http-headers go http-post


【解决方案1】:

使用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 的方式。

【讨论】:

  • 我忘了提到我使用的是 OAuth 2.0 进行授权。我找到了标准的here
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多