jasonz
jasonz

Reputation: 1345

How to add HTTP Header in POST packet?

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.

Upvotes: 2

Views: 4290

Answers (1)

Gustavo Niemeyer
Gustavo Niemeyer

Reputation: 22991

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.

Upvotes: 3

Related Questions