databricks-sdk-golang/query.go
2020-02-14 14:55:03 +00:00

72 lines
1.3 KiB
Go

package databricks
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"github.com/google/go-querystring/query"
)
// PerformQuery can be used in a client or directly
func PerformQuery(option DBClientOption, method, path string, data interface{}, headers map[string]string) ([]byte, error) {
requestURL, err := option.getRequestURI(path)
if err != nil {
return nil, err
}
requestHeaders := option.getDefaultHeaders()
if len(headers) > 0 {
for k, v := range headers {
requestHeaders[k] = v
}
}
var requestBody []byte
if method == "GET" {
params, err := query.Values(data)
if err != nil {
return nil, err
}
requestURL += "?" + params.Encode()
} else {
bodyBytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
requestBody = bodyBytes
}
client := option.getHTTPClient()
request, err := http.NewRequest(method, requestURL, bytes.NewBuffer(requestBody))
if err != nil {
return nil, err
}
for k, v := range requestHeaders {
request.Header.Set(k, v)
}
resp, err := client.Do(request)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if resp.StatusCode >= 400 {
return nil, fmt.Errorf("Response from server (%d) %s", resp.StatusCode, string(body))
}
return body, nil
}