Voglio fare una richiesta POST a un'API inviando i miei dati come application/x-www-form-urlencodedtipo di contenuto. A causa del fatto che devo gestire le intestazioni della richiesta, sto utilizzando il http.NewRequest(method, urlStr string, body io.Reader)metodo per creare una richiesta. Per questa richiesta POST aggiungo la mia query di dati all'URL e lascio il corpo vuoto, qualcosa del genere:
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)
}
Quando rispondo, ottengo sempre un 400 BAD REQUEST. Credo che il problema dipenda dalla mia richiesta e l'API non capisce quale payload sto pubblicando. Sono a conoscenza di metodi come Request.ParseForm, non sono proprio sicuro di come usarlo in questo contesto. Forse mi manca qualche ulteriore intestazione, forse c'è un modo migliore per inviare il payload come application/jsontipo utilizzando il bodyparametro?