go - 获取 Go 的 HTTP post 来模拟 curl -d

标签 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()

我做错了什么吗?谢谢!

最佳答案

我看不出您提供的代码片段有任何特殊问题,但您可能没有按照 application/x-www-form-urlencoded's specification 的要求对数据进行编码。 .

尝试使用 PostForm相反,它将代表您执行此操作:

import (
    "net/url"
)

// ...

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

关于go - 获取 Go 的 HTTP post 来模拟 curl -d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21471725/

相关文章:

go - 在 docker exec 响应开始时解释并删除无用的字节

parsing - 使用 yacc 的模态解析器

testing - 转到类型错误 : struct does not implement interface

go - golang 中的这些//!+//!- 标签是什么?

go - 为什么 Revel JSON 响应中的所有键都不大写?

go - 如何使用 Gorilla 指定 WS ping 的频率

go - 如何在不使用time.Sleep的情况下等待所有goroutine完成?

loops - 使用 goroutine 无限期地迭代文件

algorithm - 算法:两个有序列表之间的差异,按顺序和组成

json - 为什么在接口(interface)中添加 func 会导致 json.Unmarshal 失败?