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/7/28 14:00: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/7/28 14:00:38 阅读更多 →
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/7/28 14:00:38 阅读更多 →

最新新闻

git操作命令

git操作命令

1 首次克隆 代码git clone 2 查询本地状态git status3 添加缓存 添加指定文件git add <文件名>添加 所有git add .删除缓存1 不会删除物理文件&#xff0c;只是将已经add的文件删除git rm --cached <文件名 >2 从缓存区删除某一个目录下所有文件git rm -r --cach…

2026/7/28 14:11:47 阅读更多 →
Comfy-Photoshop-SD:5步实现AI绘画与Photoshop无缝集成的终极方案

Comfy-Photoshop-SD:5步实现AI绘画与Photoshop无缝集成的终极方案

Comfy-Photoshop-SD&#xff1a;5步实现AI绘画与Photoshop无缝集成的终极方案 【免费下载链接】Comfy-Photoshop-SD Download this extension via the ComfyUI manager to establish a connection between ComfyUI and the Auto-Photoshop-SD plugin in Photoshop. https://git…

2026/7/28 14:11:47 阅读更多 →
万能视频格式转换器 v 2018 全能版

万能视频格式转换器 v 2018 全能版

万能视频格式转换器是一款强大的视频格式转换软件&#xff0c;支持多种视频格式的转换&#xff0c;这款软件可以拍摄你自己喜欢的DIY视频&#xff0c;也可以将RM、RMVB、AVI、WMV、MPG 、MPEG、FLV、3GP、MP4、SWF、ASF、DIVX、XVID、3GP2、FLV1、MPEG1、MPEG2、MPEG3、MPEG4、…

2026/7/28 14:11:47 阅读更多 →
laravel 创建中间件

laravel 创建中间件

1&#xff0c;生成中间件:php artisan make:middleware LoginMiddleware 目录在blog\app\Http\Middleware\LoginMiddleware.php 2&#xff0c;注册中间件。blog\app\Http\Kernel.php protected $routeMiddleware [ ‘auth’ > \Illuminate\Auth\Middleware\Authenticate::c…

2026/7/28 14:11:47 阅读更多 →
终极缠论量化分析插件:让通达信自动识别买卖信号

终极缠论量化分析插件:让通达信自动识别买卖信号

终极缠论量化分析插件&#xff1a;让通达信自动识别买卖信号 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否还在为复杂的缠论分析而头疼&#xff1f;是否想要一个能够自动识别中枢、线段和买卖点…

2026/7/28 14:11:47 阅读更多 →
AgentRun知识库功能:RAG架构与智能体长期记忆实践

AgentRun知识库功能:RAG架构与智能体长期记忆实践

1. 项目概述&#xff1a;AgentRun知识库功能的核心价值 去年在开发一个智能客服系统时&#xff0c;我深刻体会到传统对话机器人的局限性——它们就像个健忘症患者&#xff0c;每次对话都要从头开始。这正是函数计算平台AgentRun最新上线的知识库功能要解决的核心痛点。这个功能…

2026/7/28 14:10:47 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻