Як надіслати запит POST у Go?


83

Я намагаюся зробити запит 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. Я думаю, це свого роду тест e2e
привіт,

Відповіді:


132

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

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

15
правильно ... якраз зараз я дивився на це ... здається, вам потрібно прочитати вихідний код не тільки godoc, щоб зрозуміти, як він повинен працювати.
Гей,

41

Я знаю, що це давно, але ця відповідь з’явилася в результатах пошуку. Для наступного хлопця - запропонована та прийнята відповідь працює, однак код, спочатку поданий у питанні, нижчого рівня, ніж повинен бути. На це ніхто не встиг.

//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


Ви кажете, що код операційної системи був довший, ніж потрібно, але ваш код не обробляє заголовки налаштувань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 Ні, у вихідній документації 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.