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
?