GO_网络编程---HTTP 编程
一、HTTP 基础前置知识1. 网页访问完整流程用户输入域名域名发送至DNS 服务器DNS 解析返回对应服务器 IP 地址客户端通过拿到的 IP 地址向 Web 服务器发起 TCP 连接客户端发送HTTP 请求包给服务端Web 服务器处理请求返回HTTP 响应包网页 HTML / 资源客户端浏览器渲染页面展示给用户。2. 基础概念SSL/TLSHTTP 明文传输不安全SSL/TLS 为 HTTP 加密层加密后协议为 HTTPS域名 URL域名方便人类记忆用于 DNS 解析成 IPURL完整资源定位地址包含域名、路径、请求参数HTTP 核心通信模型客户端浏览器 / 程序→ 请求包 → 服务端 → 响应包 → 客户端一问一答短连接。报文结构请求报文请求行 请求头key:value键值对 空行 请求体响应报文状态行 响应头 空行 响应体常见状态码200 OK请求成功404 Not Found请求资源不存在。二、底层 TCP 通信HTTP 底层基于 TCPHTTP 本质是封装后的 TCP 应用层协议先掌握原生 TCP 服务端 / 客户端。1. TCP 服务端代码go运行package main import ( fmt net ) func main() { // 1. 监听端口8000 listener, err : net.Listen(tcp, :8000) if err ! nil { fmt.Println(Listen err , err) return } defer listener.Close() // 延迟关闭监听套接字 // 2. 阻塞等待客户端连接 conn, errl : listener.Accept() if errl ! nil { fmt.Println(Accept errl , errl) return } defer conn.Close() // 延迟关闭客户端连接 // 3. 读取客户端发送的数据 buf : make([]byte, 1024*4) // 4KB缓冲区 n, err2 : conn.Read(buf) if n 0 { fmt.Println(Read err , err2) return } fmt.Printf(#%v#, string(buf[:n])) }2. TCP 客户端手动构造 HTTP 请求报文原生 TCP 手动拼接标准 HTTP1.1 请求报文向 HTTP 服务端发送请求并接收响应go运行package main import ( fmt net ) func main() { // 1. 主动连接TCP服务端 conn, err : net.Dial(tcp, :8000) if err ! nil { fmt.Println(dial err , err) return } defer conn.Close() // 2. 手动构造标准HTTP GET请求报文 requestBuf : GET /go HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xamlxml, application/x-ms-xbap, */*\r\nAccept-Language: zh-Hans-CN,zh-Hans;q0.8,en-US;q0.5,en;q0.3\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)\r\nAccept-Encoding: gzip, deflate\r\nHost: 127.0.0.1:8000\r\nConnection: Keep-Alive\r\n\r\n // 发送请求包服务端才会返回响应 conn.Write([]byte(requestBuf)) // 3. 读取服务器返回的HTTP响应报文 buf : make([]byte, 1024*4) n, errl : conn.Read(buf) if n 0 { fmt.Println(Read err , errl) return } // 打印完整响应报文 fmt.Printf(#%v#, string(buf[:n])) }三、Go 标准库 net/http 编程重点Go 内置net/http封装了 TCP 底层逻辑无需手动处理套接字快速实现 HTTP 服务端、客户端。核心 API 说明http.HandleFunc(path string, handler func(ResponseWriter, *Request))注册路由与处理函数http.ListenAndServe(addr string, handler Handler) error监听端口启动 HTTP 服务addr监听地址如:8000、127.0.0.1:8000handler统一处理器填 nil 使用默认多路分发器。1. 最简 HTTP 服务端固定路由访问地址http://127.0.0.1:8000/gogo运行package main import ( fmt net/http ) // 业务逻辑处理函数 func myHandler(w http.ResponseWriter, r *http.Request) { // w向客户端写响应数据 // r读取客户端请求信息 fmt.Fprintln(w, hello world) } func main() { // 注册路由访问/go 自动执行myHandler http.HandleFunc(/go, myHandler) // 监听8000端口启动HTTP服务 http.ListenAndServe(127.0.0.1:8000, nil) }2. 全局路由 HTTP 服务端根路径 /所有路径都匹配该处理函数使用w.Write()返回字节数据go运行package main import ( net/http ) // w给客户端回复数据 // req读取客户端发送的数据 func HandConn(w http.ResponseWriter, req *http.Request) { w.Write([]byte(hello go)) // 写入响应体 } func main() { // 注册根路由所有访问路径都会进入该函数 http.HandleFunc(/, HandConn) // 监听绑定8000端口 http.ListenAndServe(:8000, nil) }3. HTTP 服务端获取客户端完整请求信息通过*http.Request结构体提取请求方法、URL、请求头、请求体go运行package main import ( fmt net/http ) func HandConn(w http.ResponseWriter, r *http.Request) { // 打印客户端请求信息 fmt.Println(r.Method , r.Method) // 请求方法 GET/POST fmt.Println(r.URL , r.URL) // 请求URL与参数 fmt.Println(r.Header , r.Header) // 请求头所有key-value fmt.Println(r.Body , r.Body) // 请求体流 // 返回响应给客户端 w.Write([]byte(hello go)) } func main() { http.HandleFunc(/, HandConn) http.ListenAndServe(:8000, nil) }4. HTTP 客户端http.Get 网页请求模拟浏览器发起 GET 请求读取服务端响应状态、响应头、网页源码go运行package main import ( fmt net/http ) func main() { // 发起GET请求 resp, err : http.Get(http://www.baidu.com) if err ! nil { fmt.Println(http.Get err , err) return } defer resp.Body.Close() // 必须关闭响应体释放资源 // 打印响应基础信息 fmt.Println(Status , resp.Status) // 状态文本 200 OK fmt.Println(StatusCode , resp.StatusCode) // 状态码 200/404 fmt.Println(Header , resp.Header) // 服务端响应头 fmt.Println(Body , resp.Body) // 网页数据流 // 循环读取完整网页内容 buf : make([]byte, 4*1024) var tmp string for { n, err : resp.Body.Read(buf) if n 0 { fmt.Println(read err , err) break } tmp string(buf[:n]) } fmt.Println(网页完整内容\n, tmp) }四、实战网络爬虫基于 http 包爬虫四大步骤明确目标确定爬取网站、分页规则爬取HTTP GET 获取页面完整源码提取筛选需要的有效数据持久化数据写入文件 / 数据库。1. 单任务爬虫串行爬取速度慢go运行package main import ( fmt net/http os strconv ) // HttpGet 请求url返回页面完整源码 func HttpGet(url string) (result string, err error) { resp, err1 : http.Get(url) if err1 ! nil { err err1 return } defer resp.Body.Close() // 循环读取网页body buf : make([]byte, 1024*4) for { n, err : resp.Body.Read(buf) if n 0 { // 读取完毕或异常 fmt.Println(resp.Body.Read err , err) break } result string(buf[:n]) } return } // 爬取指定区间页面 func DoWork(start, end int) { fmt.Printf(正在爬取 %d 到 %d 的页面\n, start, end) // 贴吧分页规则pn(页码-1)*50 for i : start; i end; i { url : http://tieba.baidu.com/f?kw%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9Fieutf-8pn strconv.Itoa((i-1)*50) fmt.Println(当前爬取url , url) // 爬取页面源码 result, err : HttpGet(url) if err ! nil { fmt.Println(HttpGet err , err) continue } // 写入html文件保存 fileName : strconv.Itoa(i) .html f, err1 : os.Create(fileName) if err1 ! nil { fmt.Println(os.Create err1 , err1) continue } f.WriteString(result) f.Close() } } func main() { var start, end int fmt.Printf(请输入起始页 ( 1) :) fmt.Scan(start) fmt.Printf(请输入终止页 ( 起始页) :) fmt.Scan(end) DoWork(start, end) }2. 并发版爬虫goroutine 通道速度大幅提升核心优化每页启动独立 goroutine 并发爬取channel 做同步等待所有任务完成go运行package main import ( fmt net/http os strconv ) // 公共函数请求网页获取源码 func HttpGet(url string) (result string, err error) { resp, err1 : http.Get(url) if err1 ! nil { err err1 return } defer resp.Body.Close() buf : make([]byte, 1024*4) for { n, err : resp.Body.Read(buf) if n 0 { fmt.Println(resp.Body.Read err , err) break } result string(buf[:n]) } return } // 单个页面爬取协程函数 func SpiderPage(i int, pageChan chan- int) { url : http://tieba.baidu.com/f?kw%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9Fieutf-8pn strconv.Itoa((i-1)*50) fmt.Printf(正在爬第%d页网页%s\n, i, url) // 爬取页面 result, err : HttpGet(url) if err ! nil { fmt.Println(HttpGet err , err) pageChan - i return } // 保存文件 fileName : strconv.Itoa(i) .html f, err1 : os.Create(fileName) if err1 ! nil { fmt.Println(os.Create err1 , err1) pageChan - i return } f.WriteString(result) f.Close() // 爬取完成向通道发送页码标记任务结束 pageChan - i } func main() { var start, end int fmt.Printf(请输入起始页 ( 1) :) fmt.Scan(start) fmt.Printf(请输入终止页 ( 起始页) :) fmt.Scan(end) // 创建同步通道缓冲大小为总页面数 pageChan : make(chan int, end-start1) // 循环启动goroutine并发爬取 for i : start; i end; i { go SpiderPage(i, pageChan) } // 阻塞等待所有页面爬取完成 for i : start; i end; i { -pageChan } close(pageChan) fmt.Println(全部页面爬取完成) }五、学习总结HTTP 是应用层协议底层依赖 TCPDNS 负责域名转 IP 建立连接Go 原生net包可手动实现 TCP 通信手动拼接 HTTP 报文理解底层原理net/http标准库封装 TCP 细节一行代码快速搭建 HTTP 服务端 / 客户端服务端HandleFunc注册路由ListenAndServe启动服务客户端http.Get快速发起网页请求注意defer resp.Body.Close()释放资源爬虫基于 HTTP 客户端实现串行爬取效率低搭配 goroutinechannel 实现并发爬虫提速。

相关新闻

树莓派驱动6屏Cyberdeck:多屏扩展、3D打印外壳与系统配置全攻略

树莓派驱动6屏Cyberdeck:多屏扩展、3D打印外壳与系统配置全攻略

1. 项目概述:当树莓派遇上“赛博甲板”如果你和我一样,是个对复古未来主义科技和DIY硬件着迷的人,那么“Cyberdeck”这个词一定不会陌生。它源自赛博朋克文化,描绘的是一种高度个性化、模块化、甚至有点粗犷的便携式计算终端。最近…

2026/10/8 4:51:38 阅读更多 →
JS - 一些小技巧

JS - 一些小技巧

一、String Skill 格式化金钱 const ThousandNum num > num.toString().replace(/\B(?(\d{3})(?!\d))/g, ","); const money ThousandNum(19941112); // money > "19,941,112"生成随机ID const RandomId len > Math.random().toString(36).s…

2026/9/29 2:22:01 阅读更多 →
C++程序设计 原理与实践 Hello World std_lib_facilities.h

C++程序设计 原理与实践 Hello World std_lib_facilities.h

作为小白&#xff0c;刚开始看《C程序设计 原理与实践 第二版》&#xff0c;第2章 Hello World 书中的经典程序很简要 // hello_world.cpp #include "std_lib_facilities.h"int main() {cout << "Hello, World!\n";return 0; }笔者采用的是自带的cl…

2026/10/7 23:07:06 阅读更多 →

最新新闻

螺栓销钉缺失检测:1209张VOC数据集与YOLOv8训练实践

螺栓销钉缺失检测:1209张VOC数据集与YOLOv8训练实践

简介&#xff1a;输电线路螺栓销钉缺失检测图像数据集专注电力设施智能巡检场景&#xff0c;面向计算机视觉研究者与电力运维开发人员&#xff0c;旨在解决销钉缺失这一高危隐患的自动识别问题。数据集共2000个文件、约89.52MB&#xff0c;包含791张高清JPEG巡检图像及1209个PA…

2026/10/12 0:32:15 阅读更多 →
AI知识简记(持续更新):用TaoToken统一Key打通VS Code与Cursor的大模型调用

AI知识简记(持续更新):用TaoToken统一Key打通VS Code与Cursor的大模型调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:32:15 阅读更多 →
信用风险预测模型实战:从标签定义、WOE特征工程到评分卡转换

信用风险预测模型实战:从标签定义、WOE特征工程到评分卡转换

简介&#xff1a;这份PDF是一篇基于机器学习算法的商业银行信用风险预测模型研究论文&#xff0c;适合金融科技、风控建模方向的从业者、研究生及竞赛选手参考。文章从信用风险研究的现实背景切入&#xff0c;系统梳理了多元判别分析、Logistic回归等传统统计方法&#xff0c;以…

2026/10/12 0:32:15 阅读更多 →
基于VGG的自然灾害图像分类:迁移学习与Grad-CAM实战

基于VGG的自然灾害图像分类:迁移学习与Grad-CAM实战

简介&#xff1a;这份资源面向图像识别与机器学习方向的初学者及进阶开发者&#xff0c;聚焦自然灾害场景的自动分类任务&#xff0c;帮助读者理解如何用VGG卷积神经网络完成从数据预处理到模型训练与评估的完整流程。压缩包共29个文件&#xff0c;约1.54MB&#xff0c;包含5个…

2026/10/12 0:31:15 阅读更多 →
JDK11核心新特性与升级实战:语法、API及GC全面解析

JDK11核心新特性与升级实战:语法、API及GC全面解析

1. 为什么说JDK11是继JDK8之后最值得升级的版本JDK11确实是一个非常特殊的存在。作为Oracle在2018年9月发布的LTS版本&#xff0c;它既是Java 8之后第一个真正意义上的长期支持版本&#xff0c;又是Oracle调整Java版本发布节奏后的关键节点。对于做Java开发的同学来说&#xff…

2026/10/12 0:31:15 阅读更多 →
Python+OpenCV答题卡自动批改:检测、切分、考号识别与选择题评分

Python+OpenCV答题卡自动批改:检测、切分、考号识别与选择题评分

简介&#xff1a;这份源码包面向计算机、数学、电子信息等专业的学生与开发者&#xff0c;聚焦答题卡自动识别与批改场景&#xff0c;可用于课程设计、期末大作业、毕设项目或初期项目立项演示。项目基于Python实现答题卡检测、试题切分、学生考号识别与选择题自动批改&#xf…

2026/10/12 0:31:15 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天&#xff0c;画面可以做到绝对的锐利、平滑与无瑕。然而&#xff0c;当一张秋日手账插画或拍立得照片过于“平整无瑕”时&#xff0c;往往会散发出一种冰冷生硬的“数码塑料感&#xff08;Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中&#xff0c;横排&#xff08;Horizontal Layout&#xff09;早已经成为了绝对的主流。然而&#xff0c;当我们翻开泛黄的线装古籍、宋版木刻诗集&#xff0c;或是欣赏一张茶道雅集的手写便签时&#xff0c;那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点&#xff0c;很多人心里都会悄悄亮起一盏警示灯。 在心理学上&#xff0c;这种现象有一个专门的称谓——“周日夜晚焦虑症&#xff08;Sunday Scaries&#xff09;”。明天又是周一&#xff0c;闹钟又要重新在七点响彻卧房&#xff1b;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →