因为近期遇到了需要请求第三方接口的功能需求,故将常见的请求方式统一封装整理。
一般来说,我们使用GET请求从服务器获取数据,当都需要对服务器数据进行变更是,则需要使用POST请求
Get请求
普通GET请求
// Get
/**
* @Description: 标准的get请求
* @receiver h
* @param urlPath http接口地址
* @return data
* @return err
*/
func (g *GetRequest) Get(urlPath string) (data string, err error) {
var res *http.Response
res, err = http.Get(urlPath)
if err != nil {
return data, err
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
// 读取标准输出
body, errRead := ioutil.ReadAll(res.Body)
if res.StatusCode != 200 || errRead != nil {
err = errors.New("请求失败")
return data, err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
携带Params参数的GET请求
// getUrlPathWithParams
/**
* @Description: 拼接url和params
* @receiver h
* @param urlPath
* @param paramMap
* @return urlPathNew
* @return err
*/
func (g GetRequest) getUrlPathWithParams(urlPath string, paramMap map[string]interface{}) (urlPathNew string, err error) {
params := url.Values{}
var parseURL *url.URL
parseURL, err = url.Parse(urlPath)
if err != nil {
return "", err
}
if paramMap != nil {
for k, v := range paramMap {
params.Set(k, datautils.ToString(v))
}
}
// 如果参数中有中文参数,这个方法会进行URLEncode
parseURL.RawQuery = params.Encode()
urlPathNew = parseURL.String()
return urlPathNew, nil
}
// GetWithParams
/**
* @Description: 携带Params参数的http请求
* @receiver h
* @param urlPath http接口地址
* @param paramMap 参数map
* @return data 返回的数据
* @return err
*/
func (g *GetRequest) GetWithParams(urlPath string, paramMap map[string]interface{}) (data string, err error) {
urlPath, err = g.getUrlPathWithParams(urlPath, paramMap)
if err != nil {
return "", err
}
data, err = g.Get(urlPath)
if err != nil {
return "", err
}
return data, nil
}
自定义Header和Cookie的GET请求
// GetPro
/**
* @Description: Get请求(专业版)(支持自定义header、cookie)
* @receiver h
* @param urlPath http接口地址
* @param paramMap 参数map
* @param headerMap 请求头Map
* @param cookies cookie列表
* @return data 返回的数据
* @return err 错误
*/
func (g *GetRequest) GetPro(urlPath string, paramMap map[string]interface{}, headerMap map[string]interface{}, cookies []*http.Cookie) (data string, err error) {
urlPath, err = g.getUrlPathWithParams(urlPath, paramMap)
if err != nil {
return "", err
}
client := http.Client{}
var req *http.Request
req, err = http.NewRequest(http.MethodGet, urlPath, nil)
// 添加请求头
if headerMap != nil {
for k, v := range headerMap {
req.Header.Add(k, datautils.ToString(v))
}
}
// 添加cookie
if cookies != nil {
for _, cookie := range cookies {
req.AddCookie(cookie)
}
}
// 发送请求
var res *http.Response
res, err = client.Do(req)
if err != nil {
return "", err
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
var body []byte
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
Post请求
将请求头的字段放入常量存储,避免后期手输时输错
const (
CONTENT_TYPE_JSON = "application/json;charset=UTF-8"
CONTENT_TYPE_URLENCODED = "application/x-www-form-urlencoded"
CONTENT_TYPE_FROM_DATA = "multipart/form-data"
)
application/json
// PostJson
/**
* @Description: POST请求(application/json)
* @receiver p
* @param urlPath
* @param bodyMap
* @return data
* @return err
*/
func (p *PostRequest) PostJson(urlPath string, bodyMap map[string]interface{}) (data string, err error) {
var bytesData []byte
bytesData, err = json.Marshal(bodyMap)
if err != nil {
return "", err
}
var res *http.Response
res, err = http.Post(urlPath, CONTENT_TYPE_JSON, bytes.NewReader(bytesData))
if err != nil {
return "", err
}
// 最后关闭res.Body文件
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
// 使用ioutil.ReadAll将res.Body中的数据读取出来,并使用body接收
var body []byte
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
application/x-www-form-urlencoded
// PostUrlencoded
/**
* @Description: POST请求(浏览器默认表单格式)(application/x-www-form-urlencoded)
* @receiver p
* @param urlPath http接口地址
* @param bodyMap 参数map
* @return data
* @return err
*/
func (p *PostRequest) PostUrlencoded(urlPath string, bodyMap map[string]interface{}) (data string, err error) {
dataVal := url.Values{}
// 拼接参数
if bodyMap != nil {
for k, v := range bodyMap {
dataVal.Set(k, datautils.ToString(v))
}
}
var res *http.Response
res, err = http.Post(urlPath, CONTENT_TYPE_URLENCODED, strings.NewReader(dataVal.Encode()))
if err != nil {
fmt.Println(err)
}
// 最后关闭res.Body文件
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
var body []byte
// 使用ioutil.ReadAll将res.Body中的数据读取出来,并使用body接收
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
multipart/form-data
// PostFormData
/**
* @Description: POST请求(multipart/form-data)
* @receiver p
* @param urlPath
* @param bodyMap
* @return data
* @return err
*/
func (p *PostRequest) PostFormData(urlPath string, bodyMap map[string]interface{}) (data string, err error) {
dataVal := url.Values{}
// 拼接参数
if bodyMap != nil {
for k, v := range bodyMap {
dataVal.Set(k, datautils.ToString(v))
}
}
var res *http.Response
res, err = http.PostForm(urlPath, dataVal)
if err != nil {
return
}
// 最后关闭res.Body文件
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
var body []byte
// 使用ioutil.ReadAll将res.Body中的数据读取出来,并使用body接收
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
自定义Header和Cookie的POST请求
// PostPro
/**
* @Description: Post请求(专业版)(支持自定义header、cookie)
* @receiver p
* @param urlPath http接口地址
* @param contentType Content-Type
* @param paramMap 参数map
* @param headerMap 请求头Map
* @param cookies cookie列表
* @return data 返回的数据
* @return err 错误
*/
func (p *PostRequest) PostPro(urlPath, contentType string, bodyMap map[string]interface{}, headerMap map[string]interface{}, cookies []*http.Cookie) (data string, err error) {
dataVal := url.Values{}
// 拼接参数
if bodyMap != nil {
for k, v := range bodyMap {
dataVal.Set(k, datautils.ToString(v))
}
}
client := http.Client{}
var req *http.Request
req, err = http.NewRequest(http.MethodPost, urlPath, strings.NewReader(dataVal.Encode()))
// 添加请求头
if headerMap != nil {
for k, v := range headerMap {
req.Header.Set(k, datautils.ToString(v))
}
}
req.Header.Set("Content-Type", contentType)
// 添加cookie
if cookies != nil {
for _, cookie := range cookies {
req.AddCookie(cookie)
}
}
// 发送请求
var res *http.Response
res, err = client.Do(req)
if err != nil {
return "", err
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
return
}
}(res.Body)
var body []byte
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
// byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&body))
return *str, nil
}
语法糖
语法糖
安装
go get github.com/melf-xyzh/gin-start
使用方法
func main(){
data, err := httpapi.Get.Get("https://api.uomg.com/api/comments.163")
if err != nil {
log.Println(err.Error())
}
log.Println(data)
data, err = httpapi.Get.GetWithParams("https://api.uomg.com/api/comments.163", map[string]interface{}{"format":"text"})
if err != nil {
log.Println(err.Error())
}
log.Println(data)
data,err = httpapi.Post.PostJson("需要请求的url",map[string]interface{}{"format":"text"})
if err != nil {
log.Println(err.Error())
}
log.Println(data)
data,err = httpapi.Post.PostFormData("需要请求的url",map[string]interface{}{"format":"text"})
if err != nil {
log.Println(err.Error())
}
log.Println(data)
data,err = httpapi.Post.PostUrlencoded("需要请求的url",map[string]interface{}{"format":"text"})
if err != nil {
log.Println(err.Error())
}
log.Println(data)
}
个人github项目地址:https://github.com/melf-xyzh/gin-start
个人导航站地址:https://guide.melf.space/MELF/
本文详细介绍了如何在Go语言中封装HTTP的GET和POST请求,包括基本请求、携带参数、自定义Header和Cookie的请求,以及不同Content-Type的POST请求。通过示例代码展示了如何处理请求和响应,提供了一种高效且灵活的API调用方式。
2109

被折叠的 条评论
为什么被折叠?



