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)


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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.