Ai
1 Star 0 Fork 0

sugar/base_code

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
request.go 5.24 KB
一键复制 编辑 原始数据 按行查看 历史
sugar 提交于 2022-11-01 14:09 +08:00 . update base/request.go.
/**
@author: sugar
@since: 2022/10/30
@desc: //TODO
**/
package base
import (
"bytes"
"encoding/json"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"os"
)
//
// HttpClient
// @Description: Http请求客户端
//
type HttpClient struct {
Url string //请求地址
Header map[string]string //请求头
RequestData map[string]interface{} //请求数据
FormData map[string]string
FormFile map[string]string
CheckRedirect func(req *http.Request, via []*http.Request) error //检查重定向
Transport *http.Transport //Transport
}
func NewHttpClient() *HttpClient {
return &HttpClient{
Header:make(map[string]string, 0),
RequestData:make(map[string]interface{}, 0),
FormData:make(map[string]string, 0),
FormFile:make(map[string]string, 0),
}
}
//
// HttpResponse
// @Description: http请求返回信息
//
type HttpResponse struct {
Status int //http 状态码
Body []byte // 返回body
Error error // 错误信息
}
//
// PostJson
// @Description: Post json请求
// @receiver that 当前结构体
// @return res *HttpResponse 返回信息
//
func (that *HttpClient) PostJson() (res *HttpResponse) {
var err error
res = &HttpResponse{}
dataJson, err := json.Marshal(that.RequestData)
if err != nil {
res.Error = err
return
}
req, err := http.NewRequest("POST", that.Url, bytes.NewBuffer(dataJson))
if err != nil {
res.Error = err
return
}
//默认
that.setHeader("Content-Type", "application/json")
//加载头
that.loadHeader(req)
resp, err := that.request(req)
if err != nil {
res.Error = err
} else {
defer resp.Body.Close()
res.Status = resp.StatusCode
res.Body, err = ioutil.ReadAll(resp.Body)
}
return
}
//
// PostForm
// @Description: Post data请求
// @receiver that 当前结构体
// @return res *HttpResponse 返回信息
//
func (that *HttpClient) PostForm() (res *HttpResponse) {
var err error
res = &HttpResponse{}
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
if that.FormData != nil {
for k, v := range that.FormData {
writer.WriteField(k, v)
}
}
//判断是否有文件
if that.FormFile != nil {
for n, p := range that.FormFile {
err = that.createFormFile(writer, n, p)
if err != nil {
res.Error = err
return
}
}
}
writer.Close()
req, err := http.NewRequest("POST", that.Url, buf)
if err != nil {
res.Error = err
return
}
that.setHeader("Content-Type", writer.FormDataContentType())
//
//加载头
that.loadHeader(req)
resp, err := that.request(req)
if err != nil {
res.Error = err
} else {
defer resp.Body.Close()
res.Status = resp.StatusCode
res.Body, err = ioutil.ReadAll(resp.Body)
}
return
}
//
// Get
// @Description: Get请求
// @receiver that 当前结构体
// @return res *HttpResponse 返回信息
//
func (that *HttpClient) Get() (res *HttpResponse) {
var err error
res = &HttpResponse{}
req, err := http.NewRequest("GET", that.Url, nil)
if err != nil {
res.Error = err
return
}
that.loadHeader(req)
resp, err := that.request(req)
if err != nil {
res.Error = err
} else {
defer resp.Body.Close()
res.Status = resp.StatusCode
res.Body, err = ioutil.ReadAll(resp.Body)
}
return
}
//
// loadHeader
// @Description: 加载头部信息
// @receiver that 当前结构体
// @param req *http.Request 请求体
//
func (that HttpClient) loadHeader(req *http.Request) {
if that.Header != nil {
for k, v := range that.Header {
req.Header.Set(k, v)
}
}
}
//
// request
// @Description: 请求
// @receiver that 当前结构体
// @param req *http.Request 请求体
// @return *http.Response 请求返回信息
// @return error 错误信息
//
func (that HttpClient) request(req *http.Request) (*http.Response, error) {
client := &http.Client{}
if that.CheckRedirect != nil {
client.CheckRedirect = that.CheckRedirect
}
if that.Transport != nil {
client.Transport = that.Transport
}
return client.Do(req)
}
//
// createFormFile
// @Description: 创建表单文件
// @receiver that 当前结构体
// @param w *multipart.Writer 写
// @param name string 文件名称
// @param path string 文件地址
// @return error 错误信息
//
func (that *HttpClient) createFormFile(w *multipart.Writer, name, path string) error {
formFile, err := w.CreateFormFile(name, path)
if err != nil {
return err
}
sourceFile, err := os.Open(path)
if err != nil {
return err
}
defer sourceFile.Close()
_, err = io.Copy(formFile, sourceFile)
if err != nil {
return err
}
return nil
}
//
// setHeader
// @Description: 设置头
// @receiver that 当前结构体
// @param k string 字段名称
// @param v string 字段值
// @return error 错误信息
//
func (that *HttpClient) setHeader(k, v string) {
if that.Header == nil {
that.Header = make(map[string]string, 0)
}
that.Header[k] = v
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/sugar09/base_code.git
git@gitee.com:sugar09/base_code.git
sugar09
base_code
base_code
1ba92f8103dd

搜索帮助