Отправка запроса POST в Golang с заголовком

Я создаю свою форму так:

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)

но форма не получена, и мой ответ не содержит никаких печенье.

когда я печатаю 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>}

1 ответов


вам нужно добавить тип контента к вашему запросу.

ты сказал http.PostForm работала так, давайте посмотрим на источник что:

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

хорошо, так что это просто обертка вокруг PostForm метод на клиенте по умолчанию. Давайте посмотрим на это:

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()))
}

OK он вызывает Post метод и передача в "application/x-www-form-urlencoded" на bodyType и делать то же самое для тела, что и вы. Давайте посмотрим на пост метод

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