Làm cách nào để gửi một yêu cầu ĐĂNG trong Go?


83

Tôi đang cố gắng thực hiện một yêu cầu ĐĂNG nhưng không thể thực hiện được. Không nhận được gì ở phía bên kia.

Đây có phải là cách nó được cho là hoạt động? Tôi biết về PostFormchức năng nhưng tôi nghĩ rằng tôi không thể sử dụng nó vì nó không thể được kiểm tra httputil, phải không?

hc := http.Client{}
req, err := http.NewRequest("POST", APIURL, nil)

form := url.Values{}
form.Add("ln", c.ln)
form.Add("ip", c.ip)
form.Add("ua", c.ua)
req.PostForm = form
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

glog.Info("form was %v", form)
resp, err := hc.Do(req)

2
Có thể trùng lặp ở đây: stackoverflow.com/questions/19253469/...
nvcnvn

bạn đang thử nghiệm với httputilcái gì?
JimB

Trình xử lý http. Tôi nghĩ rằng đó là một loại E2E thử nghiệm
hey

Câu trả lời:


132

Bạn chủ yếu có ý tưởng đúng, chỉ là việc gửi biểu mẫu sai. Biểu mẫu nằm trong phần nội dung của yêu cầu.

req, err := http.NewRequest("POST", url, strings.NewReader(form.Encode()))

15
đúng ... vừa rồi tôi đã xem xét điều đó ... có vẻ như bạn cần đọc mã nguồn không chỉ mã nguồn để biết cách nó hoạt động.
hey

41

Tôi biết điều này là cũ nhưng câu trả lời này đã xuất hiện trong kết quả tìm kiếm. Đối với người tiếp theo - câu trả lời được đề xuất và được chấp nhận có hiệu quả, tuy nhiên mã được gửi ban đầu trong câu hỏi là cấp thấp hơn nó cần phải có. Không ai rảnh cả.

//one-line post request/response...
response, err := http.PostForm(APIURL, url.Values{
    "ln": {c.ln},
    "ip": {c.ip},
    "ua": {c.ua}})

//okay, moving on...
if err != nil {
  //handle postform error
}

defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)

if err != nil {
  //handle read response error
}

fmt.Printf("%s\n", string(body))

https://golang.org/pkg/net/http/#pkg-overview


Bạn nói đang OP là lâu hơn, hơn cần thiết, nhưng mã của bạn không xử lý thiết lập tiêu đềreq.Header.Add("Content-Type", "application/x-www-form-urlencoded")
jsnfwlr

11
Các Content-Typetiêu đề được tự động thiết lập để application/x-www-form-urlencodedbởi PostForm, theo: golang.org/pkg/net/http/#PostForm
Chuck Wooters

Nếu bạn muốn thêm bất kỳ tiêu đề nào khác vào tiêu đề này, chẳng hạn như ủy quyền cơ bản, có cách nào không?
huggie

@huggie Không, tài liệu nguồn golang.org/src/net/http/client.go?s=28199:28281#L848 cho biết: "Để đặt các tiêu đề khác, hãy sử dụng NewRequest và Client.Do."
CenterOrbit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.