Ich möchte eine POST-Anfrage an eine API senden, die meine Daten als application/x-www-form-urlencoded
Inhaltstyp sendet . Aufgrund der Tatsache, dass ich die Anforderungsheader verwalten muss, verwende ich die http.NewRequest(method, urlStr string, body io.Reader)
Methode, um eine Anforderung zu erstellen. Für diese POST-Anfrage hänge ich meine Datenabfrage an die URL an und lasse den Text leer, ungefähr so:
package main
import (
"bytes"
"fmt"
"net/http"
"net/url"
"strconv"
)
func main() {
apiUrl := "https://api.com"
resource := "/user/"
data := url.Values{}
data.Set("name", "foo")
data.Add("surname", "bar")
u, _ := url.ParseRequestURI(apiUrl)
u.Path = resource
u.RawQuery = data.Encode()
urlStr := fmt.Sprintf("%v", u) // "https://api.com/user/?name=foo&surname=bar"
client := &http.Client{}
r, _ := http.NewRequest("POST", urlStr, nil)
r.Header.Add("Authorization", "auth_token=\"XXXXXXX\"")
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
r.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
resp, _ := client.Do(r)
fmt.Println(resp.Status)
}
Als Antwort bekomme ich immer eine 400 BAD REQUEST
. Ich glaube, das Problem hängt von meiner Anfrage ab und die API versteht nicht, welche Nutzdaten ich poste. Ich kenne Methoden wie Request.ParseForm
, bin mir aber nicht sicher, wie ich sie in diesem Zusammenhang verwenden soll. Vielleicht fehlt mir ein weiterer Header, vielleicht gibt es eine bessere Möglichkeit, Nutzdaten als application/json
Typ mithilfe des body
Parameters zu senden ?
b
gegebenvar b bytes.Buffer
Content-Lenght
Header nicht setzen , wiehttp.NewRequest
das bereits.strings.NewReader(data.Encode())
(effizienter) anstelle von verwendenbytes.NewBufferString(data.Encode())
. Bei func NewReader (s string) * Reader heißt es: "NewReader gibt einen neuen Reader-Messwert von s zurück. Er ähnelt bytes.NewBufferString, ist jedoch effizienter und schreibgeschützt."data.Set
sollte für beidename
undsurname
anstelle von verwendet werdendata.Add
. Es legt den Wert des Schlüssels fest, anstatt wie üblich einen anderen Wert an denselben Schlüsseldata.Add
anzuhängen.Add
funktioniert auch, ist aber nicht notwendig,append(v[key], value)
um Slice zu leeren.