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