golang的http客户端封装

简介

net/httpGo 语言标准库的一部分,它提供了创建 HTTP 客户端和服务器的能力。这个包通过简化与 HTTP 协议的交互,让开发者能够方便地构建 HTTP 请求和响应,以及处理路由等任务。

本文以 net/http 包作为底层,封装一个包含 get , post , form-data 请求的工具包

开始

创建一个项目 demo ,并创建以下目录:

在这里插入图片描述

GET方法

client 文件中创建如下方法

package clientimport ("bytes""crypto/tls""fmt""io/ioutil""net/http""net/url""time"
)/***
url 请求地址
header 头部
requestData 请求数据
*/
func GET(path string,header map[string]string, requestData map[string]string) []byte  {if(len(requestData) >0){params := url.Values{}for k,v:=range requestData{params.Add(k,v)}path = path + "?" + params.Encode()}req, _ := http.NewRequest("GET", path, bytes.NewBuffer([]byte("")))req.Header.Set("cache-control", "no-cache")for key,value :=range header{req.Header.Set(key, value)}//过滤https证书tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//关闭连接池,不然会打满语句柄DisableKeepAlives: true,}//设置请求超时时间为20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("请求错误: %s\n", err.Error())return nil}return nil
}

注意:此处需要关闭连接池,不然在多携程异步调用的时候,由于请求过多,会出现语句饼打满,导致请求报错的情况。

POST


/***
url 请求地址
header 头部
requestData 请求数据,json数据
*/
func POST(path string,header map[string]string, requestData []byte) []byte  {req, _ := http.NewRequest("POST", path, bytes.NewBuffer(requestData))req.Header.Set("cache-control", "no-cache")_, ok := header["content-type"]if ok ==false {req.Header.Set("content-type", "application/json")}for key,value :=range header{req.Header.Set(key, value)}//过滤https证书tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//关闭连接池,不然会打满语句柄DisableKeepAlives: true,}//设置请求超时时间为20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("请求错误: %s\n", err.Error())return nil}return nil
}

FormData

/***
url 请求地址
header 头部
params 其他请求参数
paramName 文件名称
path 本地文件路径
*/
func FormData(url string,header map[string]string,params map[string]string, paramName, path string) []byte {file, err := os.Open(path)if err != nil {fmt.Printf("打开文件错误: %s\n", err.Error())return nil}defer file.Close()body := &bytes.Buffer{}writer := multipart.NewWriter(body)//fmt.Printf("请求参数:%+v",params)part, err := writer.CreateFormFile(paramName, filepath.Base(path))if err != nil {fmt.Printf("文件错误: %s\n", err.Error())return nil}_, err = io.Copy(part, file)for key, val := range params {_ = writer.WriteField(key, val)}err = writer.Close()if err != nil {fmt.Printf("文件关闭错误: %s\n", err.Error())return nil}req, err := http.NewRequest("POST", url, body)req.Header.Set("Content-Type", writer.FormDataContentType())for key,value :=range header{req.Header.Set(key, value)}//过滤https证书tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//关闭连接池,不然会打满语句柄DisableKeepAlives: true,}//设置请求超时时间为20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("请求错误: %s\n", err.Error())return nil}return nil
}

Request

/***
url 请求地址
header 头部
requestData 请求数据
method 请求方法
*/
func Request(url string,header map[string]string, requestData []byte, method string) []byte{//rwLock.Lock()//payload := strings.NewReader(requestData)req, _ := http.NewRequest(method, url, bytes.NewBuffer(requestData))//req.Header.Set("content-type", "application/json")req.Header.Set("cache-control", "no-cache")for key,value :=range header{req.Header.Set(key, value)}//过滤https证书tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//关闭连接池,不然会打满语句柄DisableKeepAlives: true,}//设置请求超时时间为20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("请求错误: %s\n", err.Error())return nil}return nil}

测试

新建 main.go 文件写入以下内容:


func main()  {sendData :=make(map[string]string)sendData["name"]="测试"sendData["sex"]="男"jsonStr,_:=json.Marshal(sendData)//此处需要换成你自己的接口地址httpUrl:="https://xxxxx/api/test"headerData :=make(map[string]string)headerData["X-Ca-Key"]="22527885"headerData["Content-Type"]="application/json;charset=UTF-8"headerData["Accept"]="application/json"body:=client.POST(httpUrl,headerData,jsonStr)fmt.Printf("请求成功返回:%s\n",body)}

执行命令:

go run main.go

总结

本文对 net/http 包的简单封装,使用者可以直接拿来用,减少了开发成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTCC电路板是什么,有哪些主要应用领域

HTCC英文名称是High-Temperature Co-Fired Ceramic,又称高温共烧多层陶瓷基板。因其具有导热系数高、耐热性好、热膨胀系数小、机械强度高、绝缘性好、耐腐蚀等优势,是保持高速增加的PCB线路板之一。 SPEA作为专业电路板测试设备方案服务商,公…

FY-SA-20237·8-WhyWeSpin

Translated from the Scientific American, July/August 2023 issue. Why We Spin (我们为什么旋转) Primates may play with reality by twirling around 翻译:灵长类动物有能力通过旋转或旋转运动来操纵或扭曲他们对现实的感知。 解释: “Primates”…

【开发心得】三步本地化部署llama3大模型

目录 第一步:启动ollama 第二步:启动dify 第三步:配置模型(截图) 最近llama3很火,本文追击热点,做一个本地化部署的尝试,结果还成功了! 当然也是站在别人的肩膀上&…

【运维项目经历|027】PXE自动化部署与管理平台

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

Nginx企业级负载均衡:技术详解系列(18)—— 作为上传服务器

你好,我是赵兴晨,97年文科程序员。 在上一期的技术分享中,我们探讨了如何高效搭建Nginx下载服务器,并讨论了长连接优化策略。那么今天,咱们进一步了解Nginx的另一面——作为上传服务器的配置技巧。 作为上传服务器&a…

怎么做好企业短信服务呢?(文字短信XML接口示例)

企业短信服务已经成为各行各业都信赖的行业推广方式之一,并且短信行业也与时俱进的发展着,随之而来的就是市场上短信平台的数量也随之增多。那么怎么在鱼龙混杂的短信行业中选择适合自己的企业短信服务平台呢?企业短信服务平台又适用于哪些应…

Django的PATH路径转换器

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等,可以从前言给出的下载信息下载,大家可以评估一下。 在Django框架中,默认内置了一组PATH路径转换器,具…

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践

传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…

Facebook开户|Facebook公共主页疑难杂症详解

​​要要切克闹,公共主页我来道...哈喽呀家人们中午好,上一次学习还是在上一次..hhh相信很多家人在做Facebook的时候总会遇到各种各样匪夷所思的bug!经常被搞心态吧!那么咱们今天呢就来总结一下各类的bug以及解决方法,…

InvokeAI学习教程三:换脸

启动InvokeAI,我们先生成一张图: 在正向提示词里输入:Avant-garde couture, tactile textures, vogue aesthetics, vibrant color palette, intricate embroidery details, dramatic silhouettes 生成一张高贵夫人的图像, 或者你从…

标准发布 | 废水处理减污降碳协同评估指南(碳中和标准)

本文件主编单位:北京林业大学、北京交通大学、中国电建集团华东勘测设计研究院有限公司、 眉山市城投中恒能环保科技有限公司、 中华环保联合会水环境治理专业委员会。 本文件参编单位:中国市政工程中南设计研究总院有限公司、湖北君集环境科技股份有 公…

C++ B (1124) : 斐波那契数列第n项Plus

文章目录 一、题目描述二、参考代码 一、题目描述 二、参考代码 #include <iostream> #include <vector>using namespace std;const long long MOD 1e9 7; // 取模的值// 定义矩阵类 class Matrix { public:vector<vector<long long>> data;// 构造…

字节裁员!开启裁员新模式。。

最近&#xff0c;互联网圈不太平&#xff0c;裁员消息此起彼伏。而一向以“狼性文化”著称的字节跳动&#xff0c;却玩起了“低调裁员”&#xff0c;用一种近乎“温柔”的方式&#xff0c;慢慢挤掉“冗余”的员工。 “细水长流”&#xff1a;裁员新模式&#xff1f; 不同于以往…

【TB作品】MSP430F5529,单片机,打地鼠游戏

功能 针对这块开发板做了一个打地鼠游戏&#xff1a; 1 给单片机上电后&#xff0c;初始化显示界面&#xff0c;显示出分数和等级。 2 游戏是一轮一轮进行的&#xff0c;每一轮会以50%几率点亮板子上的五个小灯&#xff0c;表示地鼠露头需要打了。 3 一轮游戏开始后&#xff…

亚马逊又爆单了!做跨境电商就是靠选品!

其实亚马逊运营并不难&#xff0c;只要遵循亚马逊规则去做就不会有问题&#xff0c;亚马逊规则其实就是运营&#xff0c;但是&#xff01;难就难在选品&#xff01;我自己是做精品的&#xff0c;我自己明显的感觉就是&#xff0c;运营技术很厉害&#xff0c;但是好的产品面前一…

贪心算法拓展(反悔贪心)

相信大家对贪心算法已经见怪不怪了&#xff0c;但是一旦我们的决策条件会随着我们的步骤变化&#xff0c;我们该怎么办呢&#xff1f;有没有什么方法可以反悔呢&#xff1f; 今天就来讲可以后悔的贪心算法&#xff0c;反悔贪心。 https://www.luogu.com.cn/problem/CF865Dhttp…

C++栈、队列

文章目录 目录 文章目录 前言 一、stack、queue介绍 1.stack 2.queue 二、stack、queue的习题 1. 最小栈 2. 栈的压入、弹出序列 3.二叉树的层序遍历 三、stack和queue的模拟实现 1.stack的模拟实现 2.queue的模拟实现 前言 栈和队列是俩种特殊的容器&#xff0c;C在实现栈和队…

强达电路营收下滑净利润急剧放缓:周转率骤降,2次因环保被罚

《港湾商业观察》施子夫 自2022年6月向深交所创业板递交招股书起&#xff0c;深圳市强达电路股份有限公司&#xff08;以下简称&#xff0c;强达电路&#xff09;已收到深交所下发的两轮审核问询函&#xff0c;并且公司已于2023年3月31日顺利过会。但由于迟迟未提交注册申请&a…

无实验数据指导蛋白质定向进化,上海交大洪亮课题组发表微环境感知图神经网络 ProtLGN

在现代生物技术和医药研究中&#xff0c;蛋白质工程扮演着至关重要的角色。通过修改蛋白质的氨基酸序列&#xff0c;蛋白质工程可以改善或赋予蛋白质新的生物化学性质&#xff0c;如增强酶的催化效率、提高药物的亲和力或改善其热稳定性。这些改进对于开发新药、治疗疾病以及提…

lua vm 一: attempt to yield across a C-call boundary 的原因分析

使用 lua 的时候有时候会遇到这样的报错&#xff1a;“attempt to yield across a C-call boundary”。 1. 网络上的解释 可以在网上找到一些关于这个问题的解释。 1.1 解释一 这个 issue&#xff1a;一个关于 yield across a C-call boundary 的问题&#xff0c;云风的解释是…