Go에서 POST 요청을 보내는 방법은 무엇입니까?


84

POST 요청을하려고하는데 완료 할 수 없습니다. 다른 쪽에서는 아무것도받지 않습니다.

이것이 작동하는 방식입니까? PostForm기능 은 알고 있지만으로 테스트 할 수 없기 때문에 사용할 수 없다고 생각합니다 httputil.

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
여기에 중복 가능성이 있습니다. stackoverflow.com/questions/19253469/…
nvcnvn

무엇을 테스트하고 httputil있습니까?
JimB

http 처리기. 나는 E2E 테스트의 일종이라고 생각
헤이

답변:


136

당신은 대부분 올바른 아이디어를 가지고 있으며 잘못된 양식을 보내는 것입니다. 양식은 요청 본문에 속합니다.

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

15
맞아요 ... 방금 제가 그걸보고 있었는데 ... godoc이 어떻게 작동하는지 알아 보려면 소스 코드를 읽어야 할 것 같습니다.
헤이

43

나는 이것이 오래되었다는 것을 알고 있지만이 답변은 검색 결과에 나타났습니다. 다음 사람에게는 제안되고 수락 된 답변이 작동하지만 질문에 처음 제출 된 코드는 필요한 수준보다 낮습니다. 아무도 그럴 시간이 없습니다.

//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


당신은 영업 이익의 코드가 필요한 것보다 더 긴했지만, 코드가 헤더 설정을 처리하지 않습니다 말한다req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
jsnfwlr을

11
Content-Type헤더가 자동으로 설정 application/x-www-form-urlencoded함으로써 PostForm있어서, : golang.org/pkg/net/http/#PostForm
척 Wooters을

기본 인증과 같은 다른 헤더를 여기에 추가하려는 경우 방법이 있습니까?
huggie

@huggie 아니요, 소스 문서 golang.org/src/net/http/client.go?s=28199:28281#L848 은 "다른 헤더를 설정하려면 NewRequest 및 Client.Do를 사용하십시오."라고 말합니다.
CenterOrbit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.