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?
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.