Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang JSON/HTTP request like curl

Tags:

json

http

curl

go

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?

like image 801
codecode Avatar asked Mar 31 '15 21:03

codecode


People also ask

How to make a GET request with a body in Golang?

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}

How to call JSONRPC with Curl?

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:

How do I build a command line tool like curl?

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?

How to access the HTTP code from the JSON response?

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.


1 Answers

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.

like image 66
maerics Avatar answered Oct 21 '22 23:10

maerics