Je veux faire une requête POST à une API en envoyant mes données avec un type de contenu application/x-www-form-urlencoded
. En raison du fait que j'ai besoin de gérer les en-têtes de la requête, j'utilise la méthode http.NewRequest(method, urlStr string, body io.Reader)
pour créer une requête. Pour cette requête POST, j'ajoute ma requête de données à l'URL et laisse le corps vide, quelque chose comme ceci :
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)
}
En réponse, je reçois toujours un 400 BAD REQUEST
. Je crois que le problème vient de ma requête et que l'API ne comprend pas quelle charge utile je suis en train de poster. Je suis au courant de méthodes comme Request.ParseForm
, mais je ne suis pas vraiment sûr de comment l'utiliser dans ce contexte. Peut-être que je manque un autre en-tête, peut-être y a-t-il une meilleure façon d'envoyer une charge utile de type application/json
en utilisant le paramètre body
?