0 { for i := -6ren">
gpt4 book ai didi

http - 使用 header 在 Golang 中发送 POST 请求

转载 作者:IT老高 更新时间:2023-10-28 13:06:11 26 4
gpt4 key购买 nike

我这样创建表单:

form := url.Values{}
form.Add("region", "San Francisco")
if len(params) > 0 {
for i := 0; i < len(params); i += 2 {
form.Add(params[i], params[i+1])
}
testLog.Infof("form %v", form)

如果我现在使用

resp, err = http.PostForm(address+r.Path, form)

然后一切正常,我得到一个带有预期 cookie 的响应。

但是,我想添加一个 header ,在这种情况下我不能使用 PostForm 因此我手动创建了我的 POST 请求,例如:

req, err := http.NewRequest("POST", address+r.Path, strings.NewReader(form.Encode()))

然后我将内容添加到 header 并发送请求

req.Header.Add("region", "San Francisco") 
resp, err = http.DefaultClient.Do(req)

但是没有收到表单,我的回复不包含任何 cookie。

当我打印 req 时,表单看起来是 nil:

&{POST http://localhost:8081/login HTTP/1.1 1 1 map[Region:[San Francisco]] {0xc420553600} 78 [] false localhost:8081 map[] map[] <nil> map[]   <nil> <nil> <nil> <nil>}

最佳答案

您需要在请求中添加内容类型。

您说 http.PostForm 有效,所以让我们看看 source其中:

func PostForm(url string, data url.Values) (resp *Response, err error) {
return DefaultClient.PostForm(url, data)
}

好的,所以它只是默认客户端上 PostForm 方法的包装。来看看that :

func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) {
return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
}

好的,它正在调用 Post 方法并为 bodyType 传入 "application/x-www-form-urlencoded" 并执行相同的操作你正在做的 body 的事情。来看看the Post method

func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error) {
req, err := NewRequest("POST", url, body)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", bodyType)
return c.doFollowingRedirects(req, shouldRedirectPost)
}

所以解决你的问题的方法是添加

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

关于http - 使用 header 在 Golang 中发送 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40006631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com