Ich möchte eine POST-Anfrage an eine API senden, die meine Daten als application/x-www-form-urlencodedInhaltstyp 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/jsonTyp mithilfe des bodyParameters zu senden ?