Quiero realizar una solicitud POST a una API que envíe mis datos como un application/x-www-form-urlencodedtipo de contenido. Debido al hecho de que necesito administrar los encabezados de la solicitud, estoy usando el http.NewRequest(method, urlStr string, body io.Reader)método para crear una solicitud. Para esta solicitud POST, agrego mi consulta de datos a la URL y dejo el cuerpo vacío, algo como esto:
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)
}
Como respondo, siempre obtengo un 400 BAD REQUEST. Creo que el problema se basa en mi solicitud y la API no comprende qué carga útil estoy publicando. Sin Request.ParseFormembargo, soy consciente de métodos como , no estoy seguro de cómo usarlo en este contexto. Tal vez me falte un encabezado adicional, tal vez ¿hay una mejor manera de enviar la carga útil como un application/jsontipo usando el bodyparámetro?