Jak wysłać żądanie POST w Go?

84

Próbuję wysłać żądanie POST, ale nie mogę tego zrobić. Po drugiej stronie nic nie jest odbierane.

Czy tak to ma działać? Jestem świadomy tej PostFormfunkcji, ale myślę, że nie mogę jej użyć, ponieważ nie można jej przetestować httputil, prawda?

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)
Hej
źródło
2
Możliwy duplikat tutaj: stackoverflow.com/questions/19253469/ ...
nvcnvn
z czym testujesz httputil?
JimB
Procedura obsługi http. Myślę, że to rodzaj testu e2e
hej

Odpowiedzi:

136

W większości masz dobry pomysł, tylko wysłanie formularza jest błędne. Formularz znajduje się w treści żądania.

req, err := http.NewRequest("POST", url, strings.NewReader(form.Encode()))
Bezimienny
źródło
15
racja ... właśnie teraz patrzyłem na to ... wygląda na to, że musisz przeczytać kod źródłowy nie tylko godoc, aby uzyskać, jak to powinno działać.
hej
43

Wiem, że to stare, ale ta odpowiedź pojawiła się w wynikach wyszukiwania. Dla następnego gościa - zaproponowana i zaakceptowana odpowiedź działa, jednak kod pierwotnie przesłany w pytaniu jest niższego poziomu niż powinien. Nikt nie ma czasu na takie rzeczy.

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

dlxsrc
źródło
Mówisz, że kod OP był dłuższy niż był potrzebny, ale Twój kod nie obsługuje ustawiania nagłówkówreq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
jsnfwlr
11
Content-TypeNagłówek jest automatycznie ustawiany application/x-www-form-urlencodedprzez PostFormwedług: golang.org/pkg/net/http/#PostForm
Chuck Wooters
Jeśli chcesz dodać do tego dowolny inny nagłówek, taki jak podstawowa autoryzacja, czy istnieje sposób?
przytulić
@huggie Nie, dokumentacja źródłowa golang.org/src/net/http/client.go?s=28199:28281#L848 stwierdza: „Aby ustawić inne nagłówki, użyj NewRequest i Client.Do”.
CenterOrbit