Beacon/pkg/grequests/request.go

79 lines
1.6 KiB
Go

package grequests
import (
"io"
"net/http"
"time"
)
// Session 管理 HTTP 会话
type Session struct {
client *http.Client
}
// NewSession 创建一个新的会话
func NewSession() *Session {
return &Session{
client: &http.Client{
Timeout: 30 * time.Second, // 默认超时 30 秒
},
}
}
// 默认会话,用于包级别的快捷函数
var defaultSession = NewSession()
// Request 执行 HTTP 请求
func (s *Session) Request(method, url string, options ...Option) (*Response, error) {
req, err := http.NewRequest(method, url, nil)
if err != nil {
return nil, err
}
// 应用所有选项
for _, opt := range options {
opt(req)
}
resp, err := s.client.Do(req)
if err != nil {
return nil, err
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
return
}
}(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return &Response{
StatusCode: resp.StatusCode,
Body: body,
Headers: resp.Header,
}, nil
}
// Get 执行 GET 请求(会话方法)
func (s *Session) Get(url string, options ...Option) (*Response, error) {
return s.Request("GET", url, options...)
}
// Post 执行 POST 请求(会话方法)
func (s *Session) Post(url string, options ...Option) (*Response, error) {
return s.Request("POST", url, options...)
}
// Get 包级别的快捷函数
func Get(url string, options ...Option) (*Response, error) {
return defaultSession.Request("GET", url, options...)
}
func Post(url string, options ...Option) (*Response, error) {
return defaultSession.Request("POST", url, options...)
}