7天玩转 Golang 标准库之 http/net
在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。
基础用法
一:处理HTTP请求
首先,我们来看看如何使用net/http标准库发送一个HTTP请求。net/http库中的http.Get函数可以快速地对一个URL发起GET请求。
package mainimport ("fmt""io/ioutil""log""net/http"
)func main() {res, err := http.Get("http://example.com/")if err != nil {log.Fatal(err)}defer res.Body.Close()body, err := ioutil.ReadAll(res.Body)if err != nil {log.Fatal(err)}fmt.Printf("%s", body)
}
二:创建和启动HTTP服务器
在Go语言中,我们可以使用http.ListenAndServe函数配合http.HandleFunc函数快速地创建一个HTTP服务器。
package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, Gopher!")
}func main() {http.HandleFunc("/hello", helloHandler)if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal(err)}
}
三:使用http.Client自定义请求行为
有时,我们需要对HTTP请求进行更细粒度的控制,比如设置超时时间、添加请求头等等。这个时候,我们可以使用http.Client和http.Request来自定义我们的请求行为。
package mainimport ("fmt""net/http""time"
)func main() {client := http.Client{Timeout: 5 * time.Second,}req, err := http.NewRequest("GET", "http://example.com", nil)if err != nil {log.Fatal(err)}req.Header.Add("User-Agent", "myClient")resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()fmt.Printf("Response status: %s\n", resp.Status)
}
以上,我们简洁明了地介绍了如何使用Golang中的net/http标准库进行HTTP请求的发送、服务器的创建以及请求行为的自定义。但是,net/http库的功能远不止这些。
进阶用法
反向代理
反向代理是一个非常常见的需求,Golang的net/http库能简单地帮我们实现这一功能。
package mainimport ("log""net/http""net/http/httputil""net/url"
)func main() {targetUrl, _ := url.Parse("http://example.com")proxy := httputil.NewSingleHostReverseProxy(targetUrl)http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {proxy.ServeHTTP(w, r)})log.Fatal(http.ListenAndServe(":8080", nil))
}
在上述代码中,我们通过httputil.NewSingleHostReverseProxy函数创建了一个反向代理处理器,然后在http处理函数中通过这个处理器来处理进来的http请求。
升级websocket
WebSocket提供了在单个 TCP 连接上进行全双工通信的能力。在Golang中,我们可以借助golang.org/x/net/websocket包(这不是标准库,但是是官方维护的包)轻松实现WebSocket。
package mainimport ("fmt""golang.org/x/net/websocket""net/http"
)func Echo(ws *websocket.Conn) {var err errorfor {var reply stringif err = websocket.Message.Receive(ws, &reply); err != nil {fmt.Println("Can't receive")break}fmt.Println("Received back from client: " + reply)msg := "Received: " + replyfmt.Println("Sending to client: " + msg)if err = websocket.Message.Send(ws, msg); err != nil {fmt.Println("Can't send")break}}
}func main() {http.Handle("/", websocket.Handler(Echo))if err := http.ListenAndServe(":1234", nil); err != nil {log.Fatal("ListenAndServe:", err)}
}
在上面的例子中,我们创建了一个简单的回音服务,客户端发送一个消息到服务器,服务器会追加一个"Received: "前缀并发送回去。
需要注意的是,WebSocket 只能用于已具有兼容 WebSocket 的客户端(如一些现代 web 浏览器)的 HTTP 服务器。websocket包并不能用于一个普通的HTTP服务端。
当然,除了反向代理和Websocket, net/http包中还有诸多高级的使用方法。这里,我会介绍两个常见的高级应用场景:使用http.RoundTripper自定义HTTP请求过程和使用http.CookieJar接口处理Cookie。
自定义HTTP请求过程
如果你需要在发送HTTP请求时进行更多的自定义控制,如自定义DNS解析、TCP连接过程、TLS握手等等,那么你可以通过实现 http.RoundTripper 接口来满足需求。
package mainimport ("fmt""net/http"nethttp "net/http" // alias to avoid conflict"time"
)type myTransport struct {transportation http.RoundTripper
}func (t *myTransport) RoundTrip(req *http.Request) (*http.Response, error) {req.Header.Add("User-Agent", "myClient")resp, err := t.transportation.RoundTrip(req)if err != nil {return nil, err}// you can access Response herefmt.Println("Status:", resp.Status)return resp, nil
}func main() {t := &myTransport{transportation: nethttp.DefaultTransport,}client := &http.Client{Transport: t}resp, err := client.Get("http://example.com")if err != nil {log.Fatal(err)}defer resp.Body.Close()fmt.Println("Response Status:", resp.Status)
}
在上述代码中,我们实现了自己的 http.RoundTripper 接口,在每次发送HTTP请求时,添加了自定义的User-Agent头,并在请求返回后打印了响应的状态码。
处理Cookie
http.CookieJar 是一个接口,可以用来自定义HTTP请求中的cookie处理逻辑。Go标准库为我们提供了一个简单的内存CookieJar的实现 net/http/cookiejar。
package mainimport ("net/http""net/http/cookiejar""net/url"
)func main() {jar, err := cookiejar.New(nil)if err != nil {log.Fatal(err)}client := &http.Client{Jar: jar,}// Create a cookie on client sideclient.Jar.SetCookies(&url.URL{Scheme: "http", Host: "example.com"},[]*http.Cookie{{Name: "cookieName", Value: "cookieValue"}},)// Check if the cookie has been setif cookies := client.Jar.Cookies(&url.URL{Scheme: "http", Host: "example.com"}); len(cookies) > 0 {fmt.Println("Cookie:", cookies[0])}
}
在上述例子中,我们首先创建了一个新的CookieJar实例,并将其用于一个新的HTTP客户端中。然后,我们在客户端上创建了一个新的cookie,并检查它是否已经被存储在了CookieJar中。
如果这篇文章帮助了你,不妨一键三连哦?
相关文章:
7天玩转 Golang 标准库之 http/net
在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。 基础用法 一:处理HTTP请求 首…...
钡铼技术集IO数据采集可编程逻辑控制PLC无线4G环保物联网关
背景 数据采集传输对于环保企业进行分析和决策是十分重要的,而实时数据采集更能提升环保生产的执行力度,从而采取到更加及时高效的措施。因此实时数据采集RTU成为环保企业的必备产品之一。 产品介绍 在推进环保行业物联网升级过程中,环保RTU在…...
STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器
目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1 、时钟树配置 3.1.2、外设参数配置 3.1.3 、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 …...
HarmonyOS4.0系统性深入开发08服务卡片架构
服务卡片概述 服务卡片(以下简称“卡片”)是一种界面展示形式,可以将应用的重要信息或操作前置到卡片,以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用(当前卡片使用方只支持系统应用,如桌…...
002文章解读与程序——中国电机工程学报EI\CSCD\北大核心《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机优化》已提供下载资源
👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆下载资源链接Ǵ…...
Typora快捷键设置详细教程
文章目录 一、快捷键设置步骤二、设置快捷键简单案例参考资料 一、快捷键设置步骤 在typora软件中,快捷键的设置步骤主要为: 打开【文件】–>【偏好设置】,找到【通用】–>【打开高级设置】,找到 conf.user.json 文件。 然…...
《异常检测——从经典算法到深度学习》25 基于深度隔离林的异常检测算法
《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …...
第7章 1 异常处理
bug的由来及分类 p81 字符串形式表示的数字之间也可以比较大小 import re ageinput(年龄:) if age>18:print(age)列表的append操作每次只能添加一个元素: lst[] lst.append(A) lst.append(B) # lst.append(A,B) 错误python中的异常处理机制 p82 t…...
昇腾910平台安装驱动、固件、CANN toolkit、pytorch
本文使用的昇腾910平台操作系统是openEuler,之前没了解过,不过暂时感觉用起来和centOS差不多。系统架构是ARM,安装包基本都是带aarch64字样,注意和x86_64区别开,别下错了。 安装依赖 cmake 通过yum安装的cmake版本较…...
【数据挖掘】模型融合
模型融合是指将多个不同的机器学习模型组合起来,通过综合多个模型的预测结果来得到更准确的预测结果。模型融合可以提高模型的鲁棒性,减小模型的方差,提高模型的泛化能力。 常见的模型融合方法包括平均法、投票法和堆叠法。 平均法(Averagin…...
DM、Oracle、GaussDB、Kingbase8(人大金仓数据库)和HIVE给列增加注释
DM数据库给列增加注释 1、创建表 CREATE TABLE test222 ( id int NOT NULL PRIMARY KEY, name varchar(1000) DEFAULT NULL, email varchar(1000) DEFAULT NULL, phone varchar(1000) DEFAULT NULL ) 2、给列添加注释 comment on column TEST222.NAME is 这是一个列注释; 例如…...
C语言实例_stdlib.h库函数功能及其用法详解
一、前言 C语言作为一种高效、灵活的编程语言,标准库的使用对于开发人员来说是不可或缺的。其中,stdlib.h是C语言中一个重要的标准库头文件,提供了许多常用的函数和工具,以便开发人员能够更加便捷地进行内存管理、字符串处理、随…...
Error in onLoad hook: “URIError: URI malformed“ found in…报错处理以及完善uniapp针对对象传参
使用uniapp传参的过程中遇到这么一个问题,当我们需要传整个对象作为参数时,我会先将这个对象先编码,然后再解码,从而获取到怎么参数,平常实操的时候也没有遇到过问题,但是今天测试的时候,刚好一…...
c语言-位操作符练习题
文章目录 前言一、n&(n-1)的运用场景(n为整数)二、&1 和 >>的应用场景总结 前言 本篇文章介绍利用c语言的位操作符解决一些练习题,目的是掌握各个位操作符的使用和应用场景。 表1.1为c语言中的位操作符 操作符含义&按位与|按位或^按位异或~按位…...
园林机械部件自动化三维测量检测形位公差-CASAIM自动化三维检测工作站
随着园林机械的广泛应用,对其机械部件的精确测量需求也日益增加。传统的测量方法不仅效率低下,而且精度难以保证,因此,自动化三维测量技术成为了解决这一问题的有效途径。本文将重点介绍CASAIM自动化三维检测工作站在园林机械部件…...
o2o生活通全开源尊享版+多城市切换+企业付款+交友IM+平台快报
搭建教程 1.把 pigo2ov282.sql 文件里面的网址 test.souho.net 全部批量替换为你的自己的 2.使用 phpmyadmin 导入 pigo2ov282.sql 到你的数据库(直接访问/phpmyadmin 即可) 3.修改数据库文件/conf/db.php 里的数据库连接信息(请勿使用记事本…...
UE4开发BIM程序 的 流程
某机构BIM设计研究中心主任马晓龙,他对编程颇有研究。今天他会用通俗易懂的语言来讲解基于游戏引擎UE4的BIM技术可视化应用。对于想要自己开发程序的设计师一定要读一下! 1)关于UE4——UE4是什么? 可以简单的理解为,一…...
【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
【面试题】写一个睡眠函数
题目要求 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步函数执行完时返回一个 Pro…...
4. 云原生之kubesphere基础服务搭建
文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安…...
2026 主流技术栈:hermes agent多环境安装配置:Windows/Mac/Linux
一、Hermes agent 大模型选择 Hermes Agent 通过统一的模型抽象层接入不同厂商的大语言模型服务。实际部署时,建议根据数据合规要求、任务类型和成本预算进行选型。 1.1 国内场景:Kimi K2.6 对于数据需境内处理或存在私有化部署需求的场景,…...
Flink 2.2集成Flink CDC 3.6
1 、部署Flink CDC tar -zxf flink-cdc-3.6.0-2.2-bin.tar.gz -C /usr/bigtop/3.3.0/usr/libln -s /usr/bigtop/3.3.0/usr/lib/flink-cdc-3.6...
AI——LangChain 三大核心概念
LangChain 三大核心概念一、LangChain 三大核心概念1. 提示词模板 PromptTemplate2. 模型调用 ChatOpenAI / ChatZhipuAI3. 链 Chain二、完整可运行代码(带角色设定)功能三、如果你想用 **智谱 GLM**四、总结一、LangChain 三大核心概念 1. 提示词模板 …...
后端工程师知识库
后端工程师深度课程 中文知识库 一套面向中级到高级后端工程师的系统进阶课程,共 9 大专题、146 篇万字长文,每篇含底层原理、代码示例、生产实践、陷阱清单与练习题。 📅 内容基准:2026 年 5 月 —— HTTP/3 主流、TLS 1.3 pos…...
免费卸载软件再推荐!支持多款软件同时卸载、注册表清理、垃圾文件清理、空文件查找、进程管理、启动管理等等功能!强制卸载+系统清理,绝了
前言 电脑里总有那么几个“钉子户”软件!卸载按钮灰色、控制面板里找不到、残留注册表像牛皮癣一样反复出现今天推荐的这款卸载工具,不管程序多顽固、卸载器多残废,都能一键连根拔起,顺带把垃圾文件、空文件夹、无效快捷方式打包带走&#x…...
2026年想在成都装中央空调?哪家安装质保好这里有答案!
家人们,2026年了,在成都想要装中央空调的小伙伴看过来!我作为一个在中央空调领域摸爬滚打多年的真实体验者,深知大家在选择空调时的纠结和痛点。就拿成都的气候来说,夏天闷热,空调得使劲儿制冷;…...
Ubuntu18.04 配置SNPE并将ONNX模型转为DLC
文章目录0.前提条件1.ONNX下载安装2.SNPE下载3.安装SNPE相关依赖4.设置环境变量5.将ONNX模型转为DLC0.前提条件 已安装好Anaconda和Python3.10 1.ONNX下载安装 ONNX官方链接: https://github.com/onnx/onnx#installation 根据官方指导,使用Conda进行安…...
华硕笔记本性能管家G-Helper:3步告别臃肿控制中心,释放硬件潜能
华硕笔记本性能管家G-Helper:3步告别臃肿控制中心,释放硬件潜能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, V…...
银行借记卡月月有礼活动汇总(立减金达标锦囊) 解除微信支付账户限制
文章目录 引言 I 银行借记卡月月有礼活动 打开交通银行App搜索“月月有礼”参加活动 招行储蓄卡专享-月月支付抽锦鲤 浦发银行APP-“惠支付”专区-月月享十惠 II 微信支付账户限制通知 限制原因: 快进快出 提交资金来源举证资料 注意事项 III 云闪付发票抽奖 引言 【银行活动…...
魔兽争霸III终极优化指南:5大功能彻底解决现代系统兼容性问题
魔兽争霸III终极优化指南:5大功能彻底解决现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑…...
