Go发送Get / Post请求到服务器(Params、application/json、application/x-www-form-urlencoded、multipart/form-data)

本文详细介绍了如何在Go语言中封装HTTP的GET和POST请求,包括基本请求、携带参数、自定义Header和Cookie的请求,以及不同Content-Type的POST请求。通过示例代码展示了如何处理请求和响应,提供了一种高效且灵活的API调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为近期遇到了需要请求第三方接口的功能需求,故将常见的请求方式统一封装整理。

一般来说,我们使用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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值