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)

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.