Как отправить запрос POST в Go?


84

Я пытаюсь отправить запрос POST, но не могу его выполнить. С другой стороны ничего не получено.

Так оно и должно работать? Я знаю об этой PostFormфункции, но думаю, что не могу ее использовать, потому что ее нельзя протестировать httputil, верно?

hc := http.Client{}
req, err := http.NewRequest("POST", APIURL, nil)

form := url.Values{}
form.Add("ln", c.ln)
form.Add("ip", c.ip)
form.Add("ua", c.ua)
req.PostForm = form
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

glog.Info("form was %v", form)
resp, err := hc.Do(req)

2
Возможный дубликат здесь: stackoverflow.com/questions/19253469/…
nvcnvn

с чем вы тестируете httputil?
JimB

Обработчик http. Я думаю , что это своего рода тест э2э
эй

Ответы:


136

У вас в основном правильная идея, просто отправленная форма неверна. Форма входит в тело запроса.

req, err := http.NewRequest("POST", url, strings.NewReader(form.Encode()))

15
правильно ... только что я смотрел на это ... кажется, вам нужно прочитать исходный код, а не только годок, чтобы понять, как он должен работать.
Привет,

43

Я знаю, что это старый, но этот ответ появился в результатах поиска. Для следующего парня - предложенный и принятый ответ работает, однако код, изначально представленный в вопросе, является более низким уровнем, чем должен быть. На это ни у кого нет времени.

//one-line post request/response...
response, err := http.PostForm(APIURL, url.Values{
    "ln": {c.ln},
    "ip": {c.ip},
    "ua": {c.ua}})

//okay, moving on...
if err != nil {
  //handle postform error
}

defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)

if err != nil {
  //handle read response error
}

fmt.Printf("%s\n", string(body))

https://golang.org/pkg/net/http/#pkg-overview


Вы говорите, что код OP длиннее, чем нужно, но ваш код не обрабатывает заголовки настроекreq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
jsnfwlr

11
Content-TypeЗаголовок автоматически устанавливается application/x-www-form-urlencodedпутем PostForm, в соответствии с: golang.org/pkg/net/http/#PostForm
Чак Wooters

Если вы хотите добавить к этому любой другой заголовок, например, базовую авторизацию, есть ли способ?
huggie

@huggie Нет, в исходной документации golang.org/src/net/http/client.go?s=28199:28281#L848 говорится: «Чтобы установить другие заголовки, используйте NewRequest и Client.Do».
CenterOrbit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.