获取Go的HTTP帖子来模拟curl -d

时间:2014-01-31 03:06:22

标签: go

我试图通过Go将内容发布到nginx服务器。我已经验证我能够通过curl正确地发布此内容,特别是使用此命令:

$ curl http://example.com/myendpoint -d "Some Text"

我能够看到这个POST,并正确处理它。但是,当我尝试使用Go执行POST时,它会被服务器拒绝。在nginx访问日志中,我看到以下两行:

127.0.0.1 - - [30/Jan/2014:05:57:34 +0000] "POST /myendpoint HTTP/1.1" 400 0 "-" "Go 1.1 package http"
127.0.0.1 - - [30/Jan/2014:05:57:39 +0000] "Some Text" 400 172 "-" "-"

我尝试过的代码如下:

r, err := http.Post(uri, "application/x-www-form-urlencoded", bytes.NewReader(data))
if err != nil {
  log.Printf("HTTP NOTIFICATION ERROR: %s\n", err)
  return
}
r.Body.Close()

我做错了吗?谢谢!

2 个答案:

答案 0 :(得分:3)

我看不到您提供的代码段的任何特定问题,但您可能无法按application/x-www-form-urlencoded's specification的要求对数据进行编码。

请尝试使用PostForm,代表您执行此操作:

import (
    "net/url"
)

// ...

r, err := http.PostForm(uri, url.Values{"key": {"Value"}, "id": {"123"}})

答案 1 :(得分:-1)

如果您将帖子数据转换为[] byte,vs url.Values更方便,则可以使用http.Client。下面的代码显示了如何使用客户端处理新的http请求。

var client http.Client
req, err := http.NewRequest("POST", myURL, data) // data is of type []byte

if err != nil {     
    // todo: do something
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

resp, err := client.Do(req)
if err != nil {
               // todo: do something
}
defer resp.Body.Close()

    // process your response.