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

huangapple go评论76阅读模式
英文:

How to add HTTP Header in POST packet?

问题

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

英文:

I'm trying to send a POST request which needs to modify the Header.

Here is my code:

    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()
    }

I have no idea why the code doesn't work. Any clue?

Thanks in advance.


Edit: I forgot to say I was using OAuth 2.0 for authorization.

答案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头部后它能工作,可能是因为你实际上正在与的服务器想要知道你提供的内容体是如何编码的

英文:

Using tcpdump we can see that the request headers and body for the code you pasted looks like:

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

You mention in the comment above that if you add a Content-Type header it works. Doing the same process and dumping the communication between the two peers we get:

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

Which is exactly the same as the prior payload, except it now includes the provided Content-Type header. So, in terms of the behavior within the Go application itself, there's nothing special happening other than what you explicitly told it to do.

The reason why it works when you add the Content-Type header then must be that the actual server you're talking to wants to know how the content body you're providing is encoded.

huangapple
  • 本文由 发表于 2013年9月11日 23:09:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/18744915.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定