A very specific Golang interface to the Dark Sky API for my Chrome Extension
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.2 KiB

package main
import (
"compress/gzip"
"encoding/json"
"errors"
"io"
"io/ioutil"
"net/http"
)
func get(client *http.Client, url string, output interface{}) error {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return err
}
req.Header.Add("Content-Type", "application/json; charset=utf-8")
req.Header.Add("Accept-Encoding", "gzip")
response, err := client.Do(req)
if err != nil {
return err
}
defer response.Body.Close()
err = checkErrors(response)
if err != nil {
return err
}
body, err := decompress(response)
if err != nil {
return err
}
return decodeJSON(body, &output)
}
func checkErrors(response *http.Response) error {
if response.StatusCode != 200 {
body, _ := ioutil.ReadAll(response.Body)
return errors.New("Bad response: " + string(body))
}
return nil
}
func decompress(response *http.Response) (io.Reader, error) {
header := response.Header.Get("Content-Encoding")
if len(header) < 1 {
return response.Body, nil
}
reader, err := gzip.NewReader(response.Body)
if err != nil {
return nil, err
}
return reader, nil
}
func decodeJSON(body io.Reader, into interface{}) error {
jsonDecoder := json.NewDecoder(body)
return jsonDecoder.Decode(&into)
}