Saya ingin membuat permintaan POST ke API yang mengirimkan data saya sebagai application/x-www-form-urlencoded
tipe konten. Karena fakta bahwa saya perlu mengelola header permintaan, saya menggunakanhttp.NewRequest(method, urlStr string, body io.Reader)
metode untuk membuat permintaan. Untuk permintaan POST ini saya menambahkan kueri data saya ke URL dan membiarkan badan kosong, seperti ini:
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)
}
Sebagai tanggapan saya, saya selalu mendapatkan 400 BAD REQUEST
. Saya yakin masalahnya bergantung pada permintaan saya dan API tidak memahami muatan mana yang saya posting. Saya mengetahui metode seperti Request.ParseForm
, tidak begitu yakin bagaimana menggunakannya dalam konteks ini. Mungkin saya kehilangan beberapa Header lebih lanjut, mungkin adakah cara yang lebih baik untuk mengirim payload sebagai application/json
tipe menggunakan body
parameter?
b
diberikanvar b bytes.Buffer
Content-Lenght
header, sepertihttp.NewRequest
yang sudah dilakukan.strings.NewReader(data.Encode())
(lebih efisien) daripadabytes.NewBufferString(data.Encode())
. Di func NewReader (s string) * Reader , dikatakan "NewReader mengembalikan pembacaan Reader baru dari s. Ini mirip dengan bytes.NewBufferString tetapi lebih efisien dan hanya-baca."data.Set
harus digunakan untukname
dansurname
, sebagai gantidata.Add
. Ini menetapkan nilai kunci, daripada menambahkan nilai lain ke kunci yang sama, sepertidata.Add
halnya.Add
bekerja juga, tetapi tidak perluappend(v[key], value)
mengosongkan slice.