Go 语言封装 HTTP 请求的 Curl 工具包
文章目录
- Go 语言封装 HTTP 请求的 Curl 工具包
- 🏗️ 工具包结构简介
- 核心结构体定义
- 初始化函数
- 🌟 功能实现
- 1. 设置请求头
- 2. 构建请求
- 3. 发送请求
- 4. 发送 GET 请求
- 5. 发送 POST 请求
- 6. 发送 PUT 请求
- 7. 发送 DELETE 请求
- 8. 读取响应体
- 💡 实现思路
- 🚀 示例
- 🏆 总结
Go 语言封装 HTTP 请求的 Curl 工具包
在 Go 语言开发中,与 HTTP 服务进行交互是非常常见的需求。本文将分享一个用 Go 语言封装的 Curl
工具包,它提供了简洁易用的接口来进行 HTTP 请求,包括 GET
、POST
、PUT
和 DELETE
等常见操作。通过这个工具包,可以轻松管理 HTTP 请求头、查询参数和请求体,并处理响应。
🏗️ 工具包结构简介
在这个 curl
工具包中,主要定义了一个 Curl
结构体,封装了 HTTP 客户端的常见操作。
核心结构体定义
type Curl struct {client *http.Client // http clientbaseURL string // base urlheaders map[string]string // headers
}
client
:使用http.Client
发送 HTTP 请求。baseURL
:基础 URL,便于在请求时自动拼接路径。headers
:一个存储 HTTP 请求头的 map,支持动态设置。
初始化函数
func NewCurl(baseURL string, timeout time.Duration) *Curl {return &Curl{client: &http.Client{Timeout: timeout,},baseURL: strings.TrimSuffix(baseURL, "/"),headers: make(map[string]string),}
}
baseURL
:传入基础 URL。timeout
:设置超时时间。
🌟 功能实现
1. 设置请求头
SetHeader
用于设置 HTTP 请求头:
func (c *Curl) SetHeader(key, value string) {c.headers[key] = value
}
可以通过如下方式动态设置请求头:
curl.SetHeader("Content-Type", "application/json")
2. 构建请求
func (c *Curl) buildRequest(ctx context.Context, method, urlPath string, queryParams map[string]string, body io.Reader) (*http.Request, error) {// 处理完整的 URLfullURL := c.baseURL + urlPathif queryParams != nil {query := url.Values{}for key, value := range queryParams {query.Add(key, value)}fullURL += "?" + query.Encode()}// 创建请求req, err := http.NewRequestWithContext(ctx, method, fullURL, body)if err != nil {return nil, err}// 设置请求头for key, value := range c.headers {req.Header.Set(key, value)}return req, nil
}
3. 发送请求
func (c *Curl) doRequest(req *http.Request) (*http.Response, error) {resp, err := c.client.Do(req)if err != nil {return nil, err}return resp, nil
}
4. 发送 GET 请求
Get
方法通过 HTTP GET
请求获取资源:
func (c *Curl) Get(ctx context.Context, urlPath string, queryParams map[string]string) (*http.Response, error) {req, err := c.buildRequest(ctx, http.MethodGet, urlPath, queryParams, nil)if err != nil {return nil, err}return c.doRequest(req)
}
示例:
response, err := curl.Get(context.TODO(), "/user", map[string]string{"id": "123"})
5. 发送 POST 请求
Post
方法通过 HTTP POST
请求提交数据:
func (c *Curl) Post(ctx context.Context, urlPath string, body []byte) (*http.Response, error) {req, err := c.buildRequest(ctx, http.MethodPost, urlPath, nil, bytes.NewBuffer(body))if err != nil {return nil, err}return c.doRequest(req)
}
示例:
data := []byte(`{"name":"Alice"}`)
response, err := curl.Post(context.TODO(), "/user", data)
6. 发送 PUT 请求
Put
方法通过 HTTP PUT
请求更新资源:
func (c *Curl) Put(ctx context.Context, urlPath string, body []byte) (*http.Response, error) {req, err := c.buildRequest(ctx, http.MethodPut, urlPath, nil, bytes.NewBuffer(body))if err != nil {return nil, err}return c.doRequest(req)
}
示例:
data := []byte(`{"age":30}`)
response, err := curl.Put(context.TODO(), "/user", data)
7. 发送 DELETE 请求
Delete
方法通过 HTTP DELETE
请求删除资源:
func (c *Curl) Delete(ctx context.Context, urlPath string) (*http.Response, error) {req, err := c.buildRequest(ctx, http.MethodDelete, urlPath, nil, nil)if err != nil {return nil, err}return c.doRequest(req)
}
示例:
response, err := curl.Delete(context.TODO(), "/user")
8. 读取响应体
ReadResponseBody
读取 HTTP 响应体并返回字节数组:
func ReadResponseBody(resp *http.Response) ([]byte, error) {defer func(Body io.ReadCloser) {err := Body.Close()if err != nil {fmt.Printf("close response body failed: %v\n", err)}}(resp.Body)return io.ReadAll(resp.Body)
}
示例:
body, err := ReadResponseBody(response)
if err != nil {fmt.Println("Read response body error:", err)
} else {fmt.Println("Response body:", string(body))
}
💡 实现思路
- 使用
http.NewRequestWithContext
构建 HTTP 请求对象。 - 通过
client.Do(req)
发送请求。 - 动态设置请求头,支持不同的 Content-Type。
- 处理查询参数,方便 GET 请求传参。
- 读取响应体,处理服务器返回的数据。
🚀 示例
完整示例:
curl := NewCurl("https://example.com", 10*time.Second)
curl.SetHeader("Authorization", "Bearer token")
resp, err := curl.Get(context.TODO(), "/api/resource", map[string]string{"key": "value"})
if err != nil {log.Fatalf("Failed to send GET request: %v", err)
}body, err := ReadResponseBody(resp)
if err != nil {log.Fatalf("Failed to read response: %v", err)
}fmt.Println("Response:", string(body))
🏆 总结
通过封装 Curl
结构体,简化了 Go 语言中与 HTTP 服务的交互过程,提供了灵活的配置和扩展能力。通过这种封装,可以快速集成 HTTP 请求,减少模板代码的编写,提升开发效率。
相关文章:
Go 语言封装 HTTP 请求的 Curl 工具包
文章目录 Go 语言封装 HTTP 请求的 Curl 工具包🏗️ 工具包结构简介核心结构体定义初始化函数 🌟 功能实现1. 设置请求头2. 构建请求3. 发送请求4. 发送 GET 请求5. 发送 POST 请求6. 发送 PUT 请求7. 发送 DELETE 请求8. 读取响应体 💡 实现…...

RK3568 SD卡调试记录
文章目录 1、环境介绍2、概念理清3、原理图查看4、dts配置5、验证6、SD卡启动6.1、启动优先级6.2、启动流程6.2.1、Maskrom(Boot ROM)启动优先级6.2.2、Pre-loader(SPL)启动优先级 6.3、如何从sd卡启动?6.3.1、制作sd启动卡6.3.2、sd卡启动 7、总结 1、环境介绍 硬…...
高效获取历史行情数据:xtquant的实战应用
高效获取历史行情数据:xtquant的实战应用 🚀量化软件开通 🚀量化实战教程 在量化交易领域,历史行情数据是构建和测试交易策略的基础。无论是回测策略的有效性,还是进行市场分析,高质量的历史数据都是不可…...

【python爬虫】酷狗音乐爬取练习
注意:本次爬取的音乐仅有1分钟试听,仅作学习爬虫的原理,完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌,在请求里发现一段mp3文件,复制网址,确实是我们需要的url。 复制音频的…...
阿里云 DataWorks面试题集锦及参考答案
目录 简述阿里云 DataWorks 的核心功能模块及其在企业数据治理中的作用 简述 DataWorks 的核心功能模块及其应用场景 解释 DataWorks 中工作空间、项目、业务流程的三层逻辑关系 解释 DataWorks 中的 “节点”、“工作流” 和 “依赖关系” 设计 解释 DataWorks 中 “周期任…...

uniapp+Vue3 开发小程序的下载文件功能
小程序下载文件,可以先预览文件内容,然后在手机上打开文件的工具中选择保存。 简单示例:(复制到HBuilder直接食用即可) <template><view class"container-detail"><view class"example…...
Apache Log4j 2
目录 1. Apache Log4j 2 简介 1.1 什么是Log4j 2? 1.2 Log4j 2 的主要特性 2. Log4j 2 的核心组件 2.1 Logger 2.2 Appender 2.3 Layout 2.4 Filter 2.5 Configuration 3. Log4j 2 的配置 4. Log4j 2 的使用示例 4.1 Maven 依赖 4.2 示例代码 4.3 输出…...

4.2.2 ArrayList类
ArrayList类与List类的用法差不多,提供的方法也差不多。但是与List不同的是,ArrayList可以包含任意类型的数据,但是相应的,要使用包含的数据,就必须对数据做相应的装箱和拆箱(关于装箱和拆箱,请…...
L1-088 静静的推荐
L1-088 静静的推荐 - 团体程序设计天梯赛-练习集 (pintia.cn) 题解 这里代码很简单,但是主要是循环里面的内容很难理解,下面是关于循环里面的内容理解: 这里 n 10 表示有 10 个学生,k 2 表示企业接受 2 批次的推荐名单&#…...

普及听力保健知识竞赛
普及听力保健知识竞赛 热点指数:★★★ 日期:3月3日 关键词:爱耳护耳、听力健康、耳部保健、听力科普 适合行业:医疗健康、健康护理、教育培训、公益组织 推荐功能:答题、H5宣传 宣传方向:广泛普及听力…...
小结: IGMP协议
IGMP(Internet Group Management Protocol)协议详解 IGMP(Internet Group Management Protocol)是IPv4 组播(Multicast)通信的控制协议,主要用于主机和路由器之间的组播成员管理。IGMP 允许主机…...

Dify 本地部署教程
目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…...
ConcurrentHashMap从源码总结使用注意事项(源码)
ConcurrentHashMap实现原理 目录 ConcurrentHashMap实现原理核心源码解读(1)数据结构: 采用数组链表/红黑树(2)初始化(3)并发扩容(4)put 操作流程(5)计数 siz…...

前端 UI 框架发展史
上一小节我们了解了前端 UI 框架的作用和意义,接下来我们再来了解前端 UI 框架的发展历史。 虽然是讲历史,但我不想讲得太复杂,也不打算搞什么编年史记录啥的,毕竟我们不是来学历史的。 我会简单描述一下前端 UI 框架的发展历程…...

【工控】线扫相机小结 第五篇
背景介绍 线扫相机通过光栅尺的脉冲触发, 我在调试线扫过程中,发现图像被拉伸,预设调节分配器。图像正常后,我提高的相机的扫描速度(Y轴动的更快了)。 动的更快的发现,图像变短了(以…...

AI与SEO关键词智能解析
内容概要 人工智能技术正重塑搜索引擎优化的底层逻辑,其核心突破体现在关键词解析维度的结构性升级。通过机器学习算法对海量搜索数据的动态学习,AI不仅能够识别传统TF-IDF模型中的高频词汇,更能捕捉语义网络中隐含的关联特征。下表展示了传…...

STM32---FreeRTOS消息队列
一、简介 1、队列简介: 队列:是任务到任务,任务到中断、中断到任务数据交流的一种机制(消息传递)。 FreeRTOS基于队列,实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量…...

开关模式电源转换器 EMI/EMC 的集成仿真
介绍 在电力电子领域,电磁干扰 (EMI) 和电磁兼容性 (EMC) 问题可以决定设计的成败。开关模式电源转换器虽然高效且紧凑,但却是电磁噪声的常见来源,可能会对附近的组件和系统造成严重破坏。随着…...
Java虚拟机之垃圾收集(一)
目录 一、如何判定对象“生死”? 1. 引用计数算法(理论参考) 2. 可达性分析算法(JVM 实际使用) 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收? 1. 分代回收策略 2. 手动触发…...
linux---天气爬虫
代码概述 这段代码实现了一个天气查询系统,支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型,并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求,并解析返回的 JSON 数据来展示天气信息。 #in…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...