我这样创建我的表单:

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响应.

但是,我想添加一个标题,在这种情况下我不能使用PostForm,因此我手动创建了POST request,如下所示:

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

然后,我向标头添加内容并发送请求

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",然后对身体做与你正在做的相同的事情.我们来看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")

Go相关问答推荐

GO错误:Tim.Time未实现driver.Valuer(缺少方法值)

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

允许在 struct 中使用复合作为函数参数

无法读取postman 中的表单数据

3 字节切片和有符号整数类型之间的转换

在多个 struct 体中重用 Go 中的函数

Global Thread-local Storage 在 Go 中的可行性和最佳实践

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

Go struct 匿名字段是公开的还是私有的?

将 firestoreinteger_value转换为整数

GoLang: gocui 边框 colored颜色

确保 Go 1.20 编译时的严格可比性?

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

来自洪流公告的奇怪同行字段

为什么 reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

切片到数组指针的转换

如何排除溢出矩阵的坐标

我该如何做错误处理惯用的方式

函数参数的判断顺序是什么?

如何解决在mac m1中运行gcc失败退出状态1?