【Go】 HTTP编程3-路由httprouter
HttpRouter
httprouter
- httprouter是第三方的库,不是go的标准库,使用命令 go get -u github.com/julienschmidt/httprouter ,下载该模块,-u表示如果已经下载但更新到最新版本
- Router 实现了http.Handler接口,为各种 request method (get/post等) 提供了便捷的路由方式,之前是根据路径区分,现在可以根据方法区分
- 支持restful请求方式,什么是restful ,原来参数通过?参数名=参数值 进行参数传递, 现在可以把参数放到路径中 ,但是需要提前约定好每一集路径代表什么参数
- 支持ServeFiles访问静态文件,现实中 ,服务端多的是需要返回HTML页面,html页面怎么返回,在第三方包中可以把静态文件返回给客户端
- 可以自定义处理panic的方法
HttpRouter 是一个轻量级高性能的 HTTP 请求路由器(也称为多路复用器或简称 mux)用于 Go 语言。
与 Go 的 net/http 包中默认的 mux 不同,该路由器支持路由模式中的变量,并且匹配请求方法。它还具有更好的扩展性。
该路由器经过优化,具有高性能和小内存占用。即使在非常长的路径和大量路由的情况下,它也能很好地扩展。采用了一种压缩动态字典树(基数树)结构以实现高效匹配。
特点
仅显式匹配:与其他路由器(如 http.ServeMux)不同,请求的 URL 路径可能与多个模式匹配。因此它们具有一些尴尬的模式优先规则,如最长匹配或首次注册,首次匹配。通过该路由器的设计,一个请求只能匹配一个或零个路由。因此,也不会出现意外的匹配,这使其非常适合 SEO 并提高了用户体验。
不必再关心尾部斜杠:选择你喜欢的 URL 样式,如果缺少尾部斜杠或有一个额外的,路由器会自动将客户端重定向。当然,它只会这样做,如果新路径有一个处理程序。如果你不喜欢,可以关闭此行为。
路径自动修正:除了在不增加额外成本的情况下检测缺少或额外的尾部斜杠外,路由器还可以修复错误的情况并删除多余的路径元素(如 ../ 或 //)。是否有使用大写锁定键的用户?HttpRouter 可以通过进行大小写不敏感的查找并将其重定向到正确的 URL 来帮助他。
路由模式中的参数:停止解析请求的 URL 路径,只需给路径段一个名称,路由器就会将动态值传递给您。由于路由器的设计,路径参数非常便宜。
零垃圾:匹配和分派过程不会生成任何垃圾字节。唯一的堆分配是构建路径参数的键值对切片以及构建新的上下文和请求对象(后者仅在标准 Handler/HandlerFunc API 中)。在 3 参数 API 中,如果请求路径不包含任何参数,则不需要进行任何堆分配。
最佳性能:基准测试说话。请参阅下面有关实现的技术细节。
不再有服务器崩溃:您可以设置 Panic 处理程序来处理在处理 HTTP 请求期间发生的 panic。然后路由器会恢复并让 PanicHandler 记录发生的情况并提供一个友好的错误页面。
非常适合 API:路由器设计鼓励构建合理的、分层的 RESTful API。此外,它还内置了对 OPTIONS 请求和 405 Method Not Allowed 回复的本地支持。
当然,您也可以设置自定义的 NotFound 和 MethodNotAllowed 处理程序,并提供静态文件服务。
使用
下载库
$ go get github.com/julienschmidt/httprouter
package mainimport ("fmt""github.com/julienschmidt/httprouter""net/http"
)// 接受的参数 w http.ResponseWriter,r *http.Request, params httprouter.Params
func get(w http.ResponseWriter,r *http.Request, params httprouter.Params) {// 打印请求方法fmt.Printf("request method:%s",r.Method)// 打印请求体fmt.Println("request Body:")//io.Copy(os.Stdout,r.Body)// 打印请求头fmt.Println("request Header:")for k,v := range r.Header {fmt.Printf("%s = %s\n", k,v)}// 返回客户端的内容,下面两种方式等价fmt.Fprintf(w,"hello boy!")//w.Write([]byte("hello boy!"))}func panicTest(w http.ResponseWriter,r *http.Request, params httprouter.Params) {// 打印请求方法fmt.Printf("request method:%s",r.Method)// 打印请求体fmt.Println("request Body:")//io.Copy(os.Stdout,r.Body)// 打印请求头fmt.Println("request Header:")for k,v := range r.Header {fmt.Printf("%s = %s\n", k,v)}// 返回客户端的内容,下面两种方式等价fmt.Fprintf(w,"hello boy!")//w.Write([]byte("hello boy!"))// 故意制造一个数组越界 panicarr := [5]int{1, 2, 3, 4, 5}for i := 0; i < 10; i++ {fmt.Println(arr[i])}}func post(w http.ResponseWriter,r *http.Request,params httprouter.Params) {// 打印请求方法fmt.Printf("request method:%s\n",r.Method)// 打印请求体fmt.Println("request Body:")//io.Copy(os.Stdout,r.Body)// 打印请求头fmt.Println("request Header:")for k,v := range r.Header {fmt.Printf("%s = %s\n", k,v)}// 返回客户端的内容,下面两种方式等价fmt.Fprintf(w,"hello girl!")//w.Write([]byte("hello boy!"))
}func main () {router := httprouter.New()// GET is a shortcut for router.Handle(http.MethodGet, path, handle)// GET 是 router.Handle(http.MethodGet, path, handle) 简写// GET 接收两个参数,第一个参数 字符串类型 代表请求路径,第二个参数是函数类型 func(http.ResponseWriter, *http.Request, Params),代表处理函数,所以我们在写处理函数的时候,需要满足这个类型router.GET("/",get)router.GET("/panictest",panicTest)// restful 风格router.GET("/user/:name/:type/*addr", func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {fmt.Printf("name= %s,type=%s addr = %s",params.ByName("name"),params.ByName("type"),params.ByName("addr"))msg :=fmt.Sprintf("name= %s,type=%s addr = %s",params.ByName("name"),params.ByName("type"),params.ByName("addr"))writer.Write([]byte(msg))})// ServerFiles - 返回静态文件 ,访问 http://127.0.0.1:8888/file/a.html路径 ,会去目录 ./static 找 a.html文件router.ServeFiles("/file/*filepath",http.Dir("./static"))router.PanicHandler = func(writer http.ResponseWriter, request *http.Request,i interface{}) {fmt.Fprintf(writer,"服务器正在维护:%s,请稍后再试",i)}// ListenAndServe 第一个参数是地址,第二个参数是 实现 handler类型的函数http.ListenAndServe(":8888",router)}
参考资料
GitHub
GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well
文档
httprouter package - github.com/julienschmidt/httprouter - Go Packages
相关文章:
【Go】 HTTP编程3-路由httprouter
HttpRouter httprouter httprouter是第三方的库,不是go的标准库,使用命令 go get -u github.com/julienschmidt/httprouter ,下载该模块,-u表示如果已经下载但更新到最新版本Router 实现了http.Handler接口,为各种 re…...
Spring Boot 整合 SA-Token 使用详解
Spring Boot 整合 SA-Token 使用详解 在现代Web开发中,用户认证与授权是构建安全应用的基础。SA-Token是一个轻量级的Java权限认证框架,它以其简洁的API设计、高效的执行效率以及丰富的功能特性,成为了众多开发者在Spring Boot项目中实现用户…...

1.3 C 语言入门实战:从 Hello World 到基础语法解析
目录 1 程序的作用 2 初识 Hello World 2.1 新建项目 2.2 程序解释 3 printf 的作用 4 注释及其注意事项 4.1 单行注释 4.2 多行注释 4.3 嵌套错误 5 项目在磁盘上的位置 1 程序的作用 如下图所示,我们编写了一个可以做加法的程序,我们给程序…...

一文读懂什么是Go语言goroutine
1. 进程、线程和协程的区别 进程: 进程是具有一定独立功能的程序,进程是系统资源分配和调度的最小单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换…...

计算机毕业设计 农家乐管理平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

Spring Boot优缺点
Spring Boot 是一款用于简化Spring应用开发的框架,它集成了大量常用的框架和工具,大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点: 优点: 简化配置:Spring Boot自动配置功能可以根据应用的依赖自动配…...
Android Studio中创建apk签名文件
本文以macOS中Android Studio 2021.1.1版本为例介绍创建apk签名文件的操作步骤: 1.启动Android Studio,并打开一个Android项目。 2.依次点击菜单:Build -> Generate Signed Bundle / APK...。 3.在弹出的"Generate Signed Bundle or …...
CRC32 JAVA C#实现
项目中用到CRC32进行校验得地方,需要用到C#和java进行对比: 一、C#实现: class CRC32Cls { protected ulong[] Crc32Table; //生成CRC32码表 public void GetCRC32Table() { ulong Crc; …...

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用 有了前面几篇文章的铺垫,现在已经可以实现我到手测试那一步的 1.解读usb_websocket_display.launch.py 首先进入这个目录/root/dev_ws/src/origincar/originca…...
深入学习小程序第二天:事件处理与用户交互
一、概念 1. 事件绑定与类型 在小程序中,通过在组件上添加特定的属性(如 bind 开头的属性)来绑定事件处理函数,以响应用户的交互操作。常见的事件类型包括触摸事件、表单事件和系统事件: 触摸事件:用于响…...

操作系统快速入门(一)
😀前言 本篇博文是关于操作系统的,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉&…...
Spring Cloud微服务性能优化:策略、实践与未来趋势
标题:Spring Cloud微服务性能优化:策略、实践与未来趋势 摘要 在微服务架构中,服务调用链路的性能优化是确保系统高效运行的关键。Spring Cloud作为微服务架构的主流实现之一,提供了多种工具和方法来优化服务间的调用。本文将深…...

秒懂C++之多态
目录 一. 多态的概念 二. 多态的定义及实现 多态的构成条件 虚函数重写的例外 协变(基类与派生类虚函数返回值类型不同) 析构函数的重写(基类与派生类析构函数的名字不同) 练习例题 final override 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类 四. 多态的原理…...

C语言:求最大数不用数组
(1)题目: 输入一批正数用空格隔开,个数不限,输入0时结束循环,并且输出这批整数的最大值。 (2)代码: #include "stdio.h" int main() {int max 0; // 假设输入…...

零门槛成为HelpLook推荐官,邀好友加入,奖励享不停!
什么!? 还有谁不知道HelpLook推荐官计划! 只需要简单地注册加入 在好友成功订阅套餐之后 可一次性获得20%的丰厚现金返佣 HelpLook是一款快速搭建AI知识库的系统,并帮助企业0代码搭建帮助中心、FAQs、SOPs、产品文档、说明书和…...
基于python的图书馆大数据可视化分析系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
利用formdata自动序列化和xhr上传表单到后端
//FormData对象是XMLHTTPRequest level2新增的类型,它可以自动序列化表单内容,不再需要我们去写序列化表单方法; FormData()即可以直接把整个表单给它,也可以分别使用append(‘字段’,‘值’)方法给FormData(); 现在就…...

视频号小店大地震?还好我看了原文
关注卢松松,会经常给你分享一些我的经验和观点。 我X,如果不是看了原文,我差点也上当了。虽然视频号小店关闭了450个类目,但又重新开放了412个类目啊。 昨天(8月9日),视频号一口气发了10个公…...

Genymotion adb shell
Genymotion 账户是 qq邮箱 参考 Ubuntu 20.04 安装 Android 模拟器 Genymotion https://www.zzzmh.cn/post/553cd96d4e47490a90b3302a76a93c0d Genymotion adb shell adb shell C:\Program Files\Genymobile\Genymotion\tools>adb shell lsusb Bus 001 Device 001: ID …...

探索AI与社交的交汇点:看Facebook如何引领智能化革命
在当今数字化时代,人工智能(AI)正成为各大科技公司变革的重要驱动力。作为全球领先的社交媒体平台,Facebook(现Meta Platforms)正处于这一智能化革命的前沿。通过不断创新和应用AI技术,Facebook…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...