当前位置: 首页 > news >正文

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.Clienthttp.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\北大核心《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机优化》已提供下载资源

👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆下载资源链接&#x1f4…...

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 研发相关 安…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...