像curl一样的Golang JSON/HTTP请求

cod*_*ode 10 json curl http go

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

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
"query" : {
    "term" : { "user" : "kimchy" }
} }'
Run Code Online (Sandbox Code Playgroud)

随着Golang.我能找到的所有东西似乎都很难编码

http://url:port/api/_function?something=value?anotherthing=value...
Run Code Online (Sandbox Code Playgroud)

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

mae*_*ics 21

正如评论者@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
Run Code Online (Sandbox Code Playgroud)

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

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

{"body":123}
Run Code Online (Sandbox Code Playgroud)

要构建像"curl"这样的命令行工具,您需要使用许多go包(例如,用于标记解析HTTP请求处理),但可能您可以从(优秀)文档中找到所需内容.