Skip to content

Instantly share code, notes, and snippets.

@drichelson
Created May 6, 2016 22:00
Show Gist options
  • Save drichelson/103e7b6d87fb38f0036fe1a71606ddb4 to your computer and use it in GitHub Desktop.
Save drichelson/103e7b6d87fb38f0036fe1a71606ddb4 to your computer and use it in GitHub Desktop.
api client
// Attempt to minimize boilerplate code
func (l *LdApiClient) DoRequest(verb string, resource string, body interface{}, response interface{}, statusCodePredicate func(int) bool) error {
start := time.Now()
url := fmt.Sprintf("%s/%s", l.BaseUri, resource)
pre := verb + " " + url
var bodyJson []byte
var err error
if body != nil {
bodyJson, err = json.Marshal(body)
if err != nil {
return err
}
}
req, err := http.NewRequest(verb, url, bytes.NewBuffer(bodyJson))
if err != nil {
log.Println(pre)
return err
}
req.Header.Add("Authorization", "api_key "+l.ApiKey)
req.Header.Add("Content-type", "application/json")
resp, err := l.client.Do(req)
if err != nil {
log.Printf("%s %v sent body: %s", pre, time.Now().Sub(start), string(bodyJson))
return err
}
responseBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Printf("%s %v sent body: %s got response: %s", pre, time.Now().Sub(start), string(bodyJson), string(responseBody))
return err
}
if !statusCodePredicate(resp.StatusCode) {
log.Printf("%s %d %v\n\tRequest body: %s \n\tResponse body: %s", pre, resp.StatusCode, time.Now().Sub(start), string(bodyJson), string(responseBody))
return fmt.Errorf("Got unexpected response: %d", resp.StatusCode)
}
if len(responseBody) > 0 {
err = json.Unmarshal(responseBody, response)
if err != nil {
log.Printf("%s %d %v\n\tRequest body: %s\n\tResponse body: %s", pre, resp.StatusCode, time.Now().Sub(start), string(bodyJson), string(responseBody))
return err
}
}
log.Printf("%s %d %v", pre, resp.StatusCode, time.Now().Sub(start))
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment