package httpUtils import ( "bytes" "errors" "io" "io/ioutil" "mime/multipart" "net/http" "time" ) var ( client = http.Client{ Timeout: 30 * time.Second, Transport: &http.Transport{ MaxIdleConnsPerHost: 5, MaxConnsPerHost: 100, }, } ) type ByteSize int64 const ( _ = iota // ignore first value by assigning to blank identifier KB ByteSize = 1 << (10 * iota) MB ) var ( outOfBodySizeErr = errors.New("out of body size limit") ) type ResponseBody struct { StatusCode int Data []byte } type RequestFormData map[string]string // Post // Note: 只会读取小于1M的数据 func Post(url string, header map[string]string, body io.Reader) (fr *ResponseBody, err error) { fr, err = do(http.MethodPost, url, header, body, int64(1024*MB)) return } // PostFormData 提交标准的form表单 func PostFormData(url string, fromdata RequestFormData) (fr *ResponseBody, err error) { var b bytes.Buffer writer := multipart.NewWriter(&b) for k, v := range fromdata { if err = writer.WriteField(k, v); err != nil { return } } if err = writer.Close(); err != nil { return } header := map[string]string{"Content-Type": writer.FormDataContentType()} fr, err = do(http.MethodPost, url, header, &b, 2*int64(KB)) return } // Get // Note: 只会读取小于1M的数据 func Get(url string, header map[string]string) (fr *ResponseBody, err error) { fr, err = do(http.MethodGet, url, header, nil, int64(KB)) return } // GetLargeFile 获取大文件。8M func GetLargeFile(url string, header map[string]string) (fr *ResponseBody, err error) { fr, err = do(http.MethodGet, url, header, nil, int64(8*MB)) return } func do(method string, url string, header map[string]string, body io.Reader, size int64) (fr *ResponseBody, err error) { req, err := http.NewRequest(method, url, body) if err != nil { return } for k, v := range header { req.Header.Set(k, v) } resp, err := client.Do(req) if err != nil { return } defer resp.Body.Close() if resp.ContentLength > size { err = outOfBodySizeErr return } data, err := ioutil.ReadAll(io.LimitReader(resp.Body, size)) if err != nil { return } fr = &ResponseBody{ StatusCode: resp.StatusCode, Data: data, } return }