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...) }