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

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

和Golang。我能找到的所有内容似乎都很难编码为

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

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

  • 明确一点:您面临的唯一问题是某些JSON的POST?还是整个事情? (参数/标志解析,json编码等)。
  • 尽管curl可以做到,但不建议在GET请求中发送正文。虽然规范没有禁止它,但是不需要服务器解析它
  • @SimonWhitehead我了解语言语法。我正在寻找向API发送数据和从API接收数据的正确方法。 (1)我想了解它是如何工作的。 (2)根据其他一些数据,我只需要在应用程序中执行几次。因此,我有点不情愿引入两个库及其所有依赖项,以对两个不同的API进行两次调用。我知道这可能比任何人都想在这里解释的要多。如果我能指出一个资源的话。搜索使我获得了有关构建API的教程-我不需要。
  • @JimB您能否指出我所解释的通常公认的正确模式?
  • @codecode没问题-我只想弄清楚您正在努力解决的问题的哪一部分:)很高兴您得到了答案。

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

也就是说,这是如何使用golang HTTP客户端对主体执行GET请求:

1
2
3
4
5
6
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服务器将看到如下请求:

1
2
3
4
5
6
7
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包(例如,用于标志解析和HTTP请求处理),但是大概可以从(优秀的)文档中找到所需的内容。铅>

  • 谢谢您……现在,您已经很友善地指出,也许我正在解决这个错误,正确的方法是什么?
  • @codecode:这确实是一件小事-按照约定(由于HTTP规范的含糊不清),并非所有请求方法都与主体相关联(例如GET,DELETE),而有些则与主体相关联(例如PUT,POST等)。但是,如果您的目标是在golang中模拟卷曲,那么您就走对了,因为该工具允许您描述行为。