newrequest metodos golang entre diferencia http go

metodos - Realice una solicitud POST codificada en URL utilizando `http.NewRequest(...)`



metodos http rest (1)

La carga útil con codificación URL se debe proporcionar en el parámetro body del http.NewRequest(method, urlStr string, body io.Reader) , como un tipo que implementa la interfaz io.Reader .

Basado en el código de muestra:

package main import ( "fmt" "net/http" "net/url" "strconv" "strings" ) 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 urlStr := u.String() // ''https://api.com/user/'' client := &http.Client{} r, _ := http.NewRequest("POST", urlStr, strings.NewReader(data.Encode())) // URL-encoded payload 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) }

resp.Status es 200 OK esta manera.

Deseo hacer una solicitud POST a una API que envíe mis datos como tipo de contenido application/x-www-form-urlencoded . Debido al hecho de que necesito administrar los encabezados de solicitud, estoy usando el http.NewRequest(method, urlStr string, body io.Reader) 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) }

A medida que respondo, siempre recibo una 400 BAD REQUEST . Creo que el problema se basa en mi solicitud y la API no entiende qué carga estoy publicando. Sin embargo, conozco métodos como Request.ParseForm , aunque no estoy realmente seguro de cómo usarlo en este contexto. Tal vez me falta un encabezado más, tal vez hay una mejor manera de enviar la carga útil como un tipo de application/json utilizando el parámetro body ?