Golang封装http请求(Get/Post/Json),包括文件上传(转载)

封装后的代码可以实现:

Get提交
POST提交(表单)
POST提交(json)
POST提交(文件上传)

完整代码如下:

package common

import (
“bytes”
“encoding/json”
“io”
“io/ioutil”
“mime/multipart”
“net/http”
“net/url”
“os”
“path/filepath”
“strings”
)

type UploadFile struct {
// 表单名称
Name string
// 文件全路径
Filepath string
}

// 请求客户端
var httpClient = &http.Client{}

func Get(reqUrl string, reqParams map[string]string, headers map[string]string) string {
urlParams := url.Values{}
Url, _ := url.Parse(reqUrl)
for key, val := range reqParams {
urlParams.Set(key, val)
}

//如果参数中有中文参数,这个方法会进行URLEncode
Url.RawQuery = urlParams.Encode()
// 得到完整的url,http://xx?query
urlPath := Url.String()

httpRequest,_ := http.NewRequest("GET", urlPath, nil)
// 添加请求头
if headers != nil {
    for k, v := range headers {
        httpRequest.Header.Add(k,v)
    }
}
// 发送请求
resp, err := httpClient.Do(httpRequest)
if err != nil {
    panic(err)
}
defer resp.Body.Close()
response, _ := ioutil.ReadAll(resp.Body)
return string(response)

}

func PostForm(reqUrl string, reqParams map[string]string, headers map[string]string) string {
return post(reqUrl, reqParams, “application/x-www-form-urlencoded”, nil, headers)
}

func PostJson(reqUrl string, reqParams map[string]string, headers map[string]string) string {
return post(reqUrl, reqParams, “application/json”, nil, headers)
}

func PostFile(reqUrl string, reqParams map[string]string, files []UploadFile, headers map[string]string) string {
return post(reqUrl, reqParams, “multipart/form-data”, files, headers)
}

func post(reqUrl string, reqParams map[string]string, contentType string, files []UploadFile, headers map[string]string) string {
requestBody, realContentType := getReader(reqParams, contentType, files)
httpRequest,_ := http.NewRequest(“POST”, reqUrl, requestBody)
// 添加请求头
httpRequest.Header.Add(“Content-Type”, realContentType)
if headers != nil {
for k, v := range headers {
httpRequest.Header.Add(k,v)
}
}
// 发送请求
resp, err := httpClient.Do(httpRequest)
if err != nil {
panic(err)
}
defer resp.Body.Close()
response, _ := ioutil.ReadAll(resp.Body)
return string(response)
}

func getReader(reqParams map[string]string, contentType string, files []UploadFile) (io.Reader, string) {
if strings.Index(contentType, “json”) > -1 {
bytesData, _ := json.Marshal(reqParams)
return bytes.NewReader(bytesData), contentType
} else if files != nil {
body := &bytes.Buffer{}
// 文件写入 body
writer := multipart.NewWriter(body)
for _, uploadFile := range files {
file, err := os.Open(uploadFile.Filepath)
if err != nil {
panic(err)
}
part, err := writer.CreateFormFile(uploadFile.Name, filepath.Base(uploadFile.Filepath))
if err != nil {
panic(err)
}
_, err = io.Copy(part, file)
file.Close()
}
// 其他参数列表写入 body
for k, v := range reqParams {
if err := writer.WriteField(k, v); err != nil {
panic(err)
}
}
if err := writer.Close(); err != nil {
panic(err)
}
// 上传文件需要自己专用的contentType
return body, writer.FormDataContentType()
} else {
urlValues := url.Values{}
for key, val := range reqParams {
urlValues.Set(key, val)
}
reqBody:= urlValues.Encode()
return strings.NewReader(reqBody), contentType
}
}

使用方式:

Get请求

// url,请求参数,header
// 返回string
var response = Get(url, reqParams, headers);

POST表单

// url,请求参数,header
// 返回string
var response = PostForm(url, reqParams, headers)

POST JSON

// url,请求参数,header
// 返回string
var response = PostJson(url, reqParams, headers)

POST 上传文件,并且携带其他参数

files := []common.UploadFile{
{Name:“file1”, Filepath:path + “/test/aa.txt”},
{Name:“file2”, Filepath:path + “/test/bb.txt”},
}
// url,请求参数,文件,header
// 返回string
var response = PostFile(url, reqParams, files, headers)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值