1

http パッケージで単純な POST リクエストを送信するのに問題があります。

var http_client http.Client

req, err := http.NewRequest("POST", "http://login.blah", nil)
if err != nil {
  return errors.New("Error creating login request: " + err.Error())
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
body := fmt.Sprintf("?username=%s&password=%s&version=%d", client.Username, client.Password, launcherVersion)
fmt.Println("Body:", body)
req.Body = ioutil.NopCloser(bytes.NewBufferString(body))
req.ParseForm()
resp, err := http_client.Do(req)

if err != nil {
  return errors.New("Error sending login request: " + err.Error())
}

印刷物から正しい本文​​が表示されます。

Body: ?username=test&password=test&version=13

しかし、60 秒後に次のようになります。

Error sending login request: unexpected EOF

Wireshark でそれを見ると、すぐに送信されるリクエストがContent-Lengthボディなしで 0 であることがわかります。

POST / HTTP/1.1
Host: login.blah
User-Agent: Go http package
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip
4

1 に答える 1

3

文字body列は、GET リクエストでパラメーターを送信した場合と同様に、URL の末尾のように見えます。

サーバーはおそらく、POST 要求の本文がhttp://www.w3.org/TR/html401/interact/forms.html#form-data-setで定義されている multipart/form-data 形式であることを期待しています。

私はあなたがすべきだと思います

  • multipart.Writerを使用して体を構築します。

  • パッケージの例のようにPostFormを使用します。

    resp, err := http.PostForm("http://example.com/form",
        url.Values{"key": {"Value"}, "id": {"123"}})
    
于 2012-06-08T19:55:33.140 に答える