May 28, 2023

How to get JSON response from http.Get

The ideal way is not to use ioutil.ReadAll, but rather use a decoder on the reader directly. Here’s a nice function that gets a url and decodes its response onto a target structure.

var myClient = &http.Client{Timeout: 10 * time.Second}

func getJson(url string, target interface{}) error {
    r, err := myClient.Get(url)
    if err != nil {
        return err
    defer r.Body.Close()

    return json.NewDecoder(r.Body).Decode(target)

Example use:

type Foo struct {
    Bar string

func main() {
    foo1 := new(Foo) // or &Foo{}
    getJson("", foo1)

    // alternately:

    foo2 := Foo{}
    getJson("", &foo2)

You should not be using the default *http.Client structure in production as this answer originally demonstrated! (Which is what http.Get/etc call to). The reason is that the default client has no timeout set; if the remote server is unresponsive, you’re going to have a bad day.

Leave a Reply