diff --git a/restclient/client.go b/restclient/client.go index bcd7472..114482c 100644 --- a/restclient/client.go +++ b/restclient/client.go @@ -1,26 +1,51 @@ package restclient -import "net/http" +import ( + "bytes" + "encoding/json" + "mime/multipart" + "net/http" +) -// SendRequest sends an HTTP request to a URL and includes the specified headers and body -func SendRequest(url string, method string, headers map[string]string, body map[string]string) (http.Response, error) { - // Create request - req, err := http.NewRequest(method, url, nil) +// SendRequest sends an HTTP request to a URL and includes the specified headers and body. +// A body can be nil for GET requests, a map[string]string for multipart/form-data requests, +// or a struct for JSON requests +func SendRequest(url string, method string, headers map[string]string, body interface{}) (http.Response, error) { + var reqBody *bytes.Buffer + var contentType string + + switch v := body.(type) { + case nil: // Leave nil for GET requests + case map[string]string: + reqBody = &bytes.Buffer{} + writer := multipart.NewWriter(reqBody) + for key, value := range v { + writer.WriteField(key, value) + } + writer.Close() + contentType = writer.FormDataContentType() + default: + jsonBody, err := json.Marshal(body) + if err != nil { + return http.Response{}, err + } + reqBody = bytes.NewBuffer(jsonBody) + contentType = "application/json" + } + + req, err := http.NewRequest(method, url, reqBody) if err != nil { return http.Response{}, err } - // Add headers + if contentType != "" { + req.Header.Set("Content-Type", contentType) + } + for key, value := range headers { req.Header.Add(key, value) } - // Add body - for key, value := range body { - req.Form.Add(key, value) - } - - // Send request client := &http.Client{} resp, err := client.Do(req) if err != nil {