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?
That said, here is how you would perform a GET request with a body using a golang HTTP client: GET /foo HTTP/1.1 Host: localhost:3030 User-Agent: Go 1.1 package http Content-Length: 12 Accept-Encoding: gzip {"body":123}
So, you can't call jsonrpc with curl. If you really want to do that, you can make a HTTP handler that adapts the HTTP request/response to a ServerCodec. For example:
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. Thank you for this... now that you've been so kind as to point out that perhaps I'm going about this wrong, what's the right way?
Here's how you can access the HTTP code from the response: If you are unsure whether the JSON schema is stable and expect it to at times, return invalid JSON, then you could extend the parsing code so that it prints out the value received.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With