111 lines
2.2 KiB
Go
111 lines
2.2 KiB
Go
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
|
|
}
|