像curl一样的Golang JSON / HTTP请求

时间:2015-03-31 21:46:27

标签: json http curl go

我正在寻找一个快速教程,介绍如何使用Golang执行请求,模拟那些将与curl一起使用的请求。我有两个我想要与之通信的API,它们基本上以相同的方式工作。一个是ElasticSearch,另一个是Phillips Hue。我知道这两个都在Go中有库。这不是我想要的,我正在努力学习如何做到这一点:

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
"query" : {
    "term" : { "user" : "kimchy" }
} }'

使用Golang。我能找到的所有东西似乎都很难编码

http://url:port/api/_function?something=value?anotherthing=value...

但是我已经在软件中浮动了JSON对象。有没有办法可以使用JSON字符串或结构或类似的东西来模拟CURL的-d功能?

1 个答案:

答案 0 :(得分:18)

正如评论者@JimB所指出的那样,HTTP / 1.1规范不允许使用正文执行GET请求;但是,服务器实际上也不需要解析身体,所以如果你遇到奇怪的行为,不要感到惊讶。

也就是说,以下是使用golang HTTP客户端与身体执行GET请求的方法:

reader := strings.NewReader(`{"body":123}`)
request, err := http.NewRequest("GET", "http://localhost:3030/foo", reader)
// TODO: check err
client := &http.Client{}
resp, err := client.Do(request)
// TODO: check err

Web服务器将看到如下请求:

GET /foo HTTP/1.1
Host: localhost:3030
User-Agent: Go 1.1 package http
Content-Length: 12
Accept-Encoding: gzip

{"body":123}

要构建像“curl”这样的命令行工具,你需要使用一些go包(例如flag parsingHTTP request handling),但可能你可以找到你需要的东西(优秀的文档。