dongliming2416
2015-03-31 21:46
浏览 117

Golang JSON / HTTP请求,例如curl

I am looking for a quick tutorial on how to perform requests with Golang that emulate those one would use with curl. I have two APIs that I want to communicate with that both essentially work the same way. One is ElasticSearch, the other is Phillips Hue. I know that both of these have libraries in Go. That's not what I'm after, I'm trying to learn how to do this:

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

With Golang. Everything I can find people seem to be hard coding to

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

But I already have JSON objects floating around in the software. Is there a way that I can emulate the -d feature of CURL with a JSON string or struct or something similar?

图片转代码服务由CSDN问答提供 功能建议

我正在寻找一个快速教程,以了解如何使用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?otherthing = value ... 
 <  / code>  
 
 

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douxian3170 2015-03-31 22:37
    已采纳

    As commenter @JimB pointed out, doing a GET request with a body is not disallowed by the HTTP/1.1 specification; however, it is also not required that servers actually parse the body, so do not be surprised if you encounter strange behavior.

    That said, here is how you would perform a GET request with a body using a golang HTTP client:

    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
    

    The web server will see a request like this:

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

    To build a command-line tool like "curl" you will need to use a number of go packages (e.g. for flag parsing and HTTP request handling) but presumably you can find what you need from the (excellent) docs.

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题