Update client to handle GET (no body) requests, multipart requests, and JSON requests

This commit is contained in:
Maximilian 2023-07-25 15:34:11 -05:00
parent 2a32a1b3ce
commit 58514f4c5f

View File

@ -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 {