在Golang中使用标头发送POST请求

时间:2016-10-12 19:15:07

标签: http post go

我创建了这样的表单:

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

1 个答案:

答案 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")