我创建了这样的表单:
public static int ConvertFromTimeZoneToMinutesOffset(string timeZone)
{
DateTimeZone zone = DateTimeZoneProviders.Tzdb[timeZone];
// Need magic code to get offset as minutes
}
现在如果我使用
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)
然后一切正常,我得到了一个带有预期cookie的回复。
但是,我想添加一个标题,在这种情况下,我无法使用resp, err = http.PostForm(address+r.Path, form)
,因此我手动创建了PostForm
,如下所示:
POST request
然后我在标题中添加内容并发送请求
req, err := http.NewRequest("POST", address+r.Path, strings.NewReader(form.Encode()))
但是没有收到表单,我的回复中没有任何cookie。
当我打印req.Header.Add("region", "San Francisco")
resp, err = http.DefaultClient.Do(req)
时,表单看起来像req
:
nil
答案 0 :(得分:26)
您需要在请求中添加内容类型。
你说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
方法,并为"application/x-www-form-urlencoded"
传递bodyType
并为您正在做的身体做同样的事情。我们来看看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")