package callapiutils import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "net/url" "strconv" ) func AddQueryParamInt(u *url.URL, paramName string, paramValue int) { AddQueryParam(u, paramName, strconv.Itoa(paramValue)) } func AddQueryParam(u *url.URL, paramName string, paramValue string) { q := u.Query() q.Set(paramName, paramValue) u.RawQuery = q.Encode() } func FetchAndParseResultFromPost[T any, J any](u *url.URL, queryArg *J, queryResult *T) error { payloadBuf := new(bytes.Buffer) json.NewEncoder(payloadBuf).Encode(queryArg) req, err := http.NewRequest("POST", u.String(), payloadBuf) if err != nil { return err } req.Header.Add("Content-Type", "application/json") req.Header.Add("Accept", "application/json") log.Printf("Calling POST %s", u.String()) return parseApiQueryResult(u, req, queryResult) } func FetchAndParseResult[T any](u *url.URL, queryResult *T) error { req, err := http.NewRequest("GET", u.String(), nil) if err != nil { return err } req.Header.Add("Accept", "application/json") req.Header.Add("User-Agent", "bibliomane/0.1 (artlef@protonmail.com)") log.Printf("Calling GET %s", u.String()) return parseApiQueryResult(u, req, queryResult) } func parseApiQueryResult[T any](u *url.URL, req *http.Request, queryResult *T) error { client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { bodyError, err := io.ReadAll(resp.Body) if err != nil { return err } return fmt.Errorf("Call to %s returned code %d:\n%s", u.String(), resp.StatusCode, string(bodyError)) } decoder := json.NewDecoder(resp.Body) err = decoder.Decode(queryResult) if err != nil { return err } return err } func ComputeUrl(baseUrl string, paths ...string) (*url.URL, error) { u, err := url.Parse(baseUrl) if err != nil { return nil, err } for _, p := range paths { u = u.JoinPath(p) } return u, nil }