lxutils/lxCommon/http.go
2024-09-02 11:25:40 +08:00

157 lines
3.5 KiB
Go

package lxCommon
import (
"bytes"
"crypto/tls"
"github.com/bytedance/sonic"
"golang.org/x/net/publicsuffix"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"net/http/cookiejar"
"os"
"path/filepath"
"time"
)
// url 路径 filename 文件的上传参数
func PostFile(url string, files map[string]string, ext map[string]string) ([]byte, error) {
res := []byte{}
//创建一个模拟的form中的一个选项,这个form项现在是空的
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
for k, v := range files {
//打开文件句柄操作
file, err := os.Open(v)
if err != nil {
//fmt.Println("error opening file")
return res, err
}
defer file.Close()
//相当于现在还没选择文件, form项里选择文件的选项
fileWriter, err := bodyWriter.CreateFormFile(k, filepath.Base(v))
if err != nil {
//fmt.Println("error writing to buffer")
return res, err
}
//iocopy 这里相当于选择了文件,将文件放到form中
_, err = io.Copy(fileWriter, file)
if err != nil {
return res, err
}
}
//获取上传文件的类型,multipart/form-data; boundary=...
contentType := bodyWriter.FormDataContentType()
//上传的其他参数
for key, val := range ext {
_ = bodyWriter.WriteField(key, val)
}
//这个很关键,必须这样写关闭,不能使用defer关闭,不然会导致错误
bodyWriter.Close()
//发送post请求到服务端
resp, err := http.Post(url, contentType, bodyBuf)
if err != nil {
return res, err
}
defer resp.Body.Close()
res, err = ioutil.ReadAll(resp.Body)
if err != nil {
return res, err
}
return res, err
}
func NewClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
var c = &http.Client{
Timeout: time.Duration(1000 * time.Second),
Transport: tr,
}
options := cookiejar.Options{
PublicSuffixList: publicsuffix.List,
}
curCookieJar, _ := cookiejar.New(&options)
c.Jar = curCookieJar
return c
}
func HttpJsonStr(c *http.Client, method, url string, header map[string]string, body io.Reader, v *string) error {
req, err := http.NewRequest(method, url, body)
if err != nil {
return err
}
for k, v := range header {
req.Header.Add(k, v)
}
resp, err := c.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
by, err := ioutil.ReadAll(resp.Body)
*v = string(by)
return nil
}
func HttpJson(c *http.Client, method, url string, header map[string]string, body io.Reader, data interface{}) error {
req, err := http.NewRequest(method, url, body)
if err != nil {
return err
}
for k, v := range header {
req.Header.Add(k, v)
}
resp, err := c.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
by, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
err = sonic.Unmarshal(by, data)
return err
}
func HttpGetFile(url, path string) error {
res, err := http.Get(url)
if err != nil {
return err
}
f, err := os.Create(path)
defer f.Close()
if err != nil {
return err
}
_, err = io.Copy(f, res.Body)
return err
}
// 流式上传文件
func PostFilePipe(url string, files map[string]string) {
r, w := io.Pipe()
m := multipart.NewWriter(w)
go func() {
defer w.Close()
defer m.Close()
for k, f := range files {
part, err := m.CreateFormFile(k, f)
if err != nil {
continue
}
file, err := os.Open(f)
if err != nil {
continue
}
defer file.Close()
if _, err = io.Copy(part, file); err != nil {
continue
}
}
}()
http.Post(url, m.FormDataContentType(), r)
}