Tôi muốn thực hiện một yêu cầu ĐĂNG tới một API gửi dữ liệu của tôi dưới dạng một application/x-www-form-urlencoded
loại nội dung. Do thực tế là tôi cần quản lý các tiêu đề yêu cầu, tôi đang sử dụng http.NewRequest(method, urlStr string, body io.Reader)
phương pháp này để tạo một yêu cầu. Đối với yêu cầu ĐĂNG này, tôi nối truy vấn dữ liệu của mình vào URL và để trống phần nội dung, giống như sau:
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)
}
Khi tôi trả lời, tôi luôn nhận được một 400 BAD REQUEST
. Tôi tin rằng vấn đề phụ thuộc vào yêu cầu của tôi và API không hiểu tôi đang đăng tải trọng nào. Mặc dù vậy, tôi biết các phương pháp như Request.ParseForm
, nhưng không thực sự chắc chắn về cách sử dụng nó trong bối cảnh này. Có lẽ tôi đang thiếu một số Header khác, có thể có cách nào tốt hơn để gửi tải trọng dưới dạng một application/json
loại sử dụng body
tham số?