Je souhaite envoyer une requête POST à une API qui envoie mes données en tant que application/x-www-form-urlencodedtype de contenu. Étant donné que je dois gérer les en-têtes de demande, j'utilise la http.NewRequest(method, urlStr string, body io.Reader)méthode pour créer une demande. Pour cette demande 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, j'obtiens toujours un 400 BAD REQUEST. Je pense que le problème repose sur ma demande et que l'API ne comprend pas la charge utile que je publie. Je connais des méthodes comme Request.ParseForm, je ne sais pas vraiment comment l'utiliser dans ce contexte. Est-ce que je manque peut-être un autre en-tête, peut-être existe-t-il un meilleur moyen d'envoyer la charge utile en tant que application/jsontype à l'aide du bodyparamètre?