Wie sende ich eine POST-Anfrage in Go?

83

Ich versuche, eine POST-Anfrage zu stellen, aber ich kann sie nicht erledigen. Auf der anderen Seite wird nichts empfangen.

Soll es so funktionieren? Ich bin mir der PostFormFunktion bewusst, aber ich glaube, ich kann sie nicht verwenden, weil sie nicht getestet werden kann httputil, oder?

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)
Hallo
quelle
2
Mögliches Duplikat hier: stackoverflow.com/questions/19253469/…
nvcnvn
Womit testest du httputil?
JimB
Der http-Handler. Ich denke, es ist eine Art e2e-Test
hey

Antworten:

132

Sie haben meistens die richtige Idee, es ist nur das Senden des Formulars, das falsch ist. Das Formular gehört in den Hauptteil der Anfrage.

req, err := http.NewRequest("POST", url, strings.NewReader(form.Encode()))
Innominate
quelle
15
Richtig ... gerade habe ich mir das angesehen ... es scheint, dass Sie den Quellcode lesen müssen, nicht nur den Godoc, um zu erfahren, wie er funktionieren soll.
Hey
41

Ich weiß, dass dies alt ist, aber diese Antwort wurde in den Suchergebnissen angezeigt. Für den nächsten Mann - die vorgeschlagene und akzeptierte Antwort funktioniert, jedoch ist der ursprünglich in der Frage eingereichte Code niedriger als er sein muss. Niemand hat Zeit für das.

//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
quelle
Sie sagen, OPs Code war länger als nötig, aber Ihr Code kann keine Header setzenreq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
jsnfwlr
11
Der Content-TypeHeader wird automatisch gesetzt application/x-www-form-urlencodedvon PostForm: golang.org/pkg/net/http/#PostForm
Chuck Wooters
Gibt es einen Weg, wenn Sie diesem einen anderen Header hinzufügen möchten, z. B. eine Grundberechtigung?
Huggie
@huggie Nein, in der Quelldokumentation golang.org/src/net/http/client.go?s=28199:28281#L848 heißt es: "Um andere Header festzulegen, verwenden Sie NewRequest und Client.Do."
CenterOrbit