GoでPOSTリクエストを送信するにはどうすればよいですか?


83

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 2014年

httpハンドラー。これは一種のe2eテストだと思います
2014年

回答:


132

あなたはほとんど正しい考えを持っています、それは間違っているのはフォームの送信だけです。フォームはリクエストの本文に属します。

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

15
右...ちょうど今私はそれを見ていました...それがどのように機能するかを知るには、godocだけでなくソースコードを読む必要があるようです。
ねえ2014年

41

私はこれが古いことを知っていますが、この答えは検索結果に現れました。次の人のために-提案され受け入れられた答えは機能しますが、質問で最初に提出されたコードは必要以上に低レベルです。誰もそのための時間がありませんでした。

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


あなたは必要以上にOPのコードは、長かったが、あなたのコードは、ヘッダーを設定し処理しないと言う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.