GO HTTP库使用
Go的 net/http
包是一个强大且易于使用的库,用于构建HTTP服务器和客户端。通过它,你可以轻松实现HTTP请求的处理、路由、静态文件服务等功能。下面重点以及一个简单的Demo示例。
文章目录
- 1. **基础HTTP服务器**
- 2. **处理请求与响应**
- 3. **路由与处理器**
- 4. **HTTP方法处理**
- 5. **读取请求参数**
- 6. **中间件和请求处理链**
- Go `net/http` Demo: 简单的HTTP服务器
- 运行步骤
- 进一步学习
- 1. **HTTP客户端 (http.Client) 使用**
- 基本使用流程:
- HTTP客户端示例:
- 客户端说明:
- 2. **HTTP服务端 (http.Server) 使用**
- 基本使用流程:
- HTTP服务端示例:
- 服务端说明:
- 3. **客户端与服务端结合使用示例**
- HTTP服务端:
- HTTP客户端:
- 说明:
1. 基础HTTP服务器
- 使用
http.ListenAndServe
启动服务器。 - 使用
http.HandleFunc
或者http.Handle
来处理不同的URL路径。
2. 处理请求与响应
http.Request
结构体:包含客户端请求的所有信息。http.ResponseWriter
接口:用于向客户端写入HTTP响应。
3. 路由与处理器
http.HandleFunc
可以将处理逻辑和特定的URL路径绑定在一起。- 自定义处理器:实现
http.Handler
接口,创建复杂的路由。
4. HTTP方法处理
http.MethodGet
,http.MethodPost
等用于区分GET、POST等请求方法。
5. 读取请求参数
- 查询参数通过
r.URL.Query()
访问。 - POST表单数据通过
r.FormValue()
访问。
6. 中间件和请求处理链
- 创建中间件来处理请求的认证、日志等常见任务。
Go net/http
Demo: 简单的HTTP服务器
package mainimport ("fmt""net/http"
)// 首页处理器
func homeHandler(w http.ResponseWriter, r *http.Request) {// 返回欢迎信息fmt.Fprintf(w, "Welcome to the Go HTTP Server!")
}// 关于页面处理器
func aboutHandler(w http.ResponseWriter, r *http.Request) {// 返回关于信息fmt.Fprintf(w, "This is the About Page!")
}// 带参数的处理器
func helloHandler(w http.ResponseWriter, r *http.Request) {// 从URL查询参数获取 "name" 值name := r.URL.Query().Get("name")if name == "" {name = "World"}// 返回Hello信息fmt.Fprintf(w, "Hello, %s!", name)
}func main() {// 路由设置http.HandleFunc("/", homeHandler) // 处理首页请求http.HandleFunc("/about", aboutHandler) // 处理关于页面请求http.HandleFunc("/hello", helloHandler) // 处理带参数的URL// 启动服务器,监听8080端口fmt.Println("Starting server on :8080")err := http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("Error starting server:", err)}
}
运行步骤
- 保存代码: 将上述代码保存为
main.go
。 - 运行服务器: 通过命令
go run main.go
启动服务器。 - 访问页面:
- 打开浏览器访问
http://localhost:8080
,将看到 “Welcome to the Go HTTP Server!”。 - 访问
http://localhost:8080/about
,将看到 “This is the About Page!”。 - 访问
http://localhost:8080/hello?name=Go
,将看到 “Hello, Go!”。
- 打开浏览器访问
进一步学习
- 处理JSON数据: 通过
json.NewEncoder()
和json.NewDecoder()
实现JSON请求和响应的处理。 - 使用第三方路由库: 可以使用类似
gorilla/mux
的第三方库,提供更复杂的路由功能。
在Go中,http.Client
用于发起HTTP请求,而 http.Server
用于处理来自客户端的请求并响应。net/http
包内置了这些功能,能够轻松实现HTTP客户端和服务端。
1. HTTP客户端 (http.Client) 使用
http.Client
是Go中用于发送HTTP请求的核心组件。你可以使用它来发送GET、POST等请求,并处理服务器返回的响应。
基本使用流程:
- 创建
http.Client
实例。 - 使用
client.Get()
、client.Post()
等方法发起请求。 - 使用
resp.Body
读取响应数据,并记得关闭resp.Body
。
HTTP客户端示例:
package mainimport ("fmt""io/ioutil""net/http""strings"
)func main() {client := &http.Client{}// 1. 发送 GET 请求resp, err := client.Get("https://jsonplaceholder.typicode.com/posts/1")if err != nil {fmt.Println("Error:", err)return}defer resp.Body.Close()// 读取响应body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Error:", err)return}fmt.Println("GET Response:")fmt.Println(string(body))// 2. 发送 POST 请求data := strings.NewReader(`{"title":"foo","body":"bar","userId":1}`)resp, err = client.Post("https://jsonplaceholder.typicode.com/posts", "application/json", data)if err != nil {fmt.Println("Error:", err)return}defer resp.Body.Close()body, err = ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Error:", err)return}fmt.Println("\nPOST Response:")fmt.Println(string(body))
}
客户端说明:
- GET请求:
client.Get(url)
发送GET请求,并读取返回的响应。 - POST请求:
client.Post(url, contentType, body)
发送POST请求,传入JSON数据。
2. HTTP服务端 (http.Server) 使用
http.Server
用于创建HTTP服务器,它能够处理客户端的请求并做出响应。
基本使用流程:
- 使用
http.HandleFunc()
注册路由和对应的处理函数。 - 使用
http.ListenAndServe()
启动HTTP服务器并监听特定端口。
HTTP服务端示例:
package mainimport ("fmt""net/http"
)// 处理根路由请求
func homeHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Welcome to the home page!")
}// 处理 POST 请求
func postHandler(w http.ResponseWriter, r *http.Request) {if r.Method == http.MethodPost {fmt.Fprintf(w, "POST request received")} else {http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)}
}func main() {// 路由配置http.HandleFunc("/", homeHandler) // 处理首页路由http.HandleFunc("/post", postHandler) // 处理POST请求// 启动HTTP服务器,监听8080端口fmt.Println("Server starting at port 8080...")err := http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("Error starting server:", err)}
}
服务端说明:
- 注册路由: 使用
http.HandleFunc()
将特定路径与处理函数关联。 - 处理GET/POST请求: 可以使用
r.Method
检查请求类型。 - 启动服务器: 使用
http.ListenAndServe(":8080", nil)
启动服务。
3. 客户端与服务端结合使用示例
下面我们创建一个简单的HTTP服务器和客户端,客户端向服务器发送请求,服务器返回响应。
HTTP服务端:
package mainimport ("fmt""net/http"
)// 返回Hello信息
func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, Go HTTP Server!")
}func main() {http.HandleFunc("/hello", helloHandler)fmt.Println("Server starting at port 8080...")http.ListenAndServe(":8080", nil)
}
HTTP客户端:
package mainimport ("fmt""io/ioutil""net/http"
)func main() {resp, err := http.Get("http://localhost:8080/hello")if err != nil {fmt.Println("Error:", err)return}defer resp.Body.Close()// 读取响应body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Response from server:")fmt.Println(string(body))
}
说明:
- 服务器: 监听
/hello
路由,返回简单的 “Hello, Go HTTP Server!” 消息。 - 客户端: 向服务器发送GET请求,打印服务器的响应。
相关文章:
GO HTTP库使用
Go的 net/http 包是一个强大且易于使用的库,用于构建HTTP服务器和客户端。通过它,你可以轻松实现HTTP请求的处理、路由、静态文件服务等功能。下面重点以及一个简单的Demo示例。 文章目录 1. **基础HTTP服务器**2. **处理请求与响应**3. **路由与处理器*…...

数据结构 - 顺序表
0.线性表 1.定义 线性表就是零个或多个相同数据元素的有限序列。 2.线性表的存储结构 ①.顺序结构 ②.链式结构 3.线性表的表示方法 例如: 一.线性表的基本运算 二.线性表的复杂运算 1.线性表的合并运算 2.线性表的去重运算 三.顺序表 1.定义 顺序表,就…...

企业如何组建安全稳定的跨国通信网络?
组建一个安全稳定的跨国通信网络对于现代企业来说至关重要,尤其是当企业在全球范围内运营时。以下是一些关键步骤和考虑因素: 需求分析: 确定企业的具体通信需求,包括带宽要求、延迟敏感度、数据类型(如语音、视频、文…...

OCR在线识别网站现已上线!
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 由作者亲自开发的ocr识别网站哈哈,暂时汇聚了三十多种验证码模型以及算法,欢迎各路朋友去尝试,网站地址如下 http://gbj5w3.natappfree.cc/ocr 验证码类型包括但…...
排名再升2位 中国平安位列BrandZ最具价值中国品牌第9位
9月10日,凯度华通明略发布“2024年BrandZ最具价值中国品牌”榜单,中国平安位列榜单第9位,较2023年榜单排名上升2位,品牌价值韧性增长至205.14亿美元,十度蝉联中国保险行业品牌价值第一位。榜单特别提到,中国…...
k8s集群部署:环境准备
本教程基于centos9 arm架构展开。 1. 设置主机名 为每个节点设置主机别名,以便于集群中的角色识别: # 设置主节点的主机名为 kmaster sudo hostnamectl set-hostname kmaster --static# 设置工作节点1的主机名为 kworker1 sudo hostnamectl set-hostn…...

<C++> set、map模拟实现
目录 一、适配器红黑树 二、红黑树再设计 1. 重新设计 RBTree 的模板参数 2. 仿函数模板参数 3. 正向迭代器 构造 operator*() operator->() operator!() operator() operator--() 正向迭代器代码 4. 反向迭代器 构造 operator* operator-> operator operator-- operat…...
软考学习 数据结构 查找
1. 顺序查找(Sequential Search) 基本原理: 顺序查找是一种最简单、最直观的查找算法。它从数据集合的第一个元素开始,依次与目标元素进行比较,直到找到目标元素或遍历完所有元素为止。 适用条件: 适用…...
h264 视频流中添加目标检测的位置、类型信息到SEI帧
在 H.264 视频编码中,SEI(Supplemental Enhancement Information)消息用于传输额外的、非编码的数据,例如目标检测的信息。SEI 数据可以嵌入到 H.264 流中,以在解码过程中传递这些附加信息。 一、步骤 确定 SEI 类型&…...

大模型api谁家更便宜
1 openai 可点此链接查询价格:https://openai.com/api/pricing/ 2 百度 可点此链接查询价格:https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意,百度千帆平台上还提供其他家的模型调用服务, 如llama, yi-34b等…...

代码随想录算法训练营第二十三天| 455. 分发饼干、376. 摆动序列、53. 最大子序和
今日内容 贪心理论基础Leetcode. 455 分发饼干Leetcode. 376 摆动序列Leetcode. 53 最大子序和 贪心理论基础 贪心算法的本质就是选择每一阶段的最优,达到全局上的最优。 贪心算法和之前学到的所有方法相比,它没有固定的使用套路,也没有固…...

react js 路由 Router
完整的项目,我已经上传了 资料链接 起因, 目的: 路由, 这部分很难。 原因是, 多个组件,进行交互,复杂度比较高。 我看的视频教程 1. 初步使用 安装: npm install react-router-dom 修改 index.js/ 或是 main.js 把 App, 用 BrowserRouter 包裹起来 2. Navigate 点击…...

AplPost使用
请求get 方法 1,添加token 2,填写get 的参数 2,post方法 把对象的形式直接复制到row里面 3,delete方法 可以直接后面拼接参数...

【Qt】Qt与Html网页进行数据交互
前言:此项目使用达梦数据库,以Qt制作服务器,Html制作网页客户端界面,可以通过任意浏览器访问。 1、Qt与网页进行数据交互 1.1、第一步:准备qwebchannel.js文件 直接在qt的安装路径里复制即可 1.2、第二步…...

教师节特辑:AI绘制的卡通人物,致敬最可爱的人
【编号:9】教师节到了,今天我要分享一组由AI绘制的教师节主题卡通人物插画,每一幅都充满了对老师的敬意和爱戴。让我们一起用这些可爱的卡通形象,向辛勤的园丁们致敬! 🎓【教师形象】 这…...

SprinBoot+Vue智慧农业专家远程指导系统的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...

AI大模型行业专题报告:大模型发展迈入爆发期,开启AI新纪元
大规模语言模型(Large Language Models,LLM)泛指具有超大规模参数或者经过超大规模数据训练所得到的语言模型。与传统语言模型相比,大语言模型的构建过程涉及到更为复杂的训练方法,进而展现出了强大的自然语言理解能力…...

FLV 格式详解资料整理,关键帧格式解析写入库等等
FLV 是一种比较简单的视频封装格式。大致可以分为 FLV 文件头,Metadata元数据,然后一系列的音视频数据。 资料够多: FLV格式解析图 知乎用户 Linux服务器研究 画了一张格式解析图,比较全,但默认背景是白色ÿ…...

《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现
目录 一、图像直方图 1、什么是图像直方图 2、作用 1)分析图像的亮度分布 2)判断图像的对比度 3)检测图像的亮度和色彩偏移 4)图像增强和调整 5)阈值分割 3、举例 二、直方图用法 1、函数用法 2、参数解析…...
coredump-N: stack 消耗完之后,用户自定义信号处理有些问题 sigaltstack
https://mzhan017.blog.csdn.net/article/details/129401531 在上面一篇是关于stack耗尽的一个小程序例子。 https://www.man7.org/linux/man-pages/man2/sigaltstack.2.html 这里提到一个问题,就是如果栈被用光了,这个时候SIGSEGV的用户自定义的handler处理可能就没有空间进…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...