Files
rss-to-feishu-next/internal/net/client.go
2026-01-19 02:10:24 -06:00

72 lines
1.2 KiB
Go

package net
import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
"time"
)
type Client struct {
client *http.Client
}
func NewClient() *Client {
return &Client{client: &http.Client{
Timeout: time.Minute * 5,
}}
}
func (c *Client) Get(ctx context.Context, url string) (string, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return "", err
}
resp, err := c.client.Do(req)
if err != nil {
return "", err
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}
func (c *Client) Post(ctx context.Context, headers map[string]string, url string, body any, target any) error {
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(body); err != nil {
return err
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, &buf)
if err != nil {
return err
}
for k, v := range headers {
req.Header.Set(k, v)
}
resp, err := c.client.Do(req)
if err != nil {
return err
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
if err := json.NewDecoder(resp.Body).Decode(target); err != nil {
return err
}
return nil
}