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

【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是第三方的库&#xff0c;不是go的标准库&#xff0c;使用命令 go get -u github.com/julienschmidt/httprouter &#xff0c;下载该模块&#xff0c;-u表示如果已经下载但更新到最新版本Router 实现了http.Handler接口&#xff0c;为各种 re…...

Spring Boot 整合 SA-Token 使用详解

Spring Boot 整合 SA-Token 使用详解 在现代Web开发中&#xff0c;用户认证与授权是构建安全应用的基础。SA-Token是一个轻量级的Java权限认证框架&#xff0c;它以其简洁的API设计、高效的执行效率以及丰富的功能特性&#xff0c;成为了众多开发者在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 程序的作用 如下图所示&#xff0c;我们编写了一个可以做加法的程序&#xff0c;我们给程序…...

一文读懂什么是Go语言goroutine

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

计算机毕业设计 农家乐管理平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

Spring Boot优缺点

Spring Boot 是一款用于简化Spring应用开发的框架&#xff0c;它集成了大量常用的框架和工具&#xff0c;大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点&#xff1a; 优点&#xff1a; 简化配置&#xff1a;Spring Boot自动配置功能可以根据应用的依赖自动配…...

Android Studio中创建apk签名文件

本文以macOS中Android Studio 2021.1.1版本为例介绍创建apk签名文件的操作步骤&#xff1a; 1.启动Android Studio&#xff0c;并打开一个Android项目。 2.依次点击菜单&#xff1a;Build -> Generate Signed Bundle / APK...。 3.在弹出的"Generate Signed Bundle or …...

CRC32 JAVA C#实现

项目中用到CRC32进行校验得地方&#xff0c;需要用到C#和java进行对比&#xff1a; 一、C#实现&#xff1a; class CRC32Cls { protected ulong[] Crc32Table; //生成CRC32码表 public void GetCRC32Table() { ulong Crc; …...

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用 ​ 有了前面几篇文章的铺垫&#xff0c;现在已经可以实现我到手测试那一步的 1.解读usb_websocket_display.launch.py ​ 首先进入这个目录/root/dev_ws/src/origincar/originca…...

深入学习小程序第二天:事件处理与用户交互

一、概念 1. 事件绑定与类型 在小程序中&#xff0c;通过在组件上添加特定的属性&#xff08;如 bind 开头的属性&#xff09;来绑定事件处理函数&#xff0c;以响应用户的交互操作。常见的事件类型包括触摸事件、表单事件和系统事件&#xff1a; 触摸事件&#xff1a;用于响…...

操作系统快速入门(一)

&#x1f600;前言 本篇博文是关于操作系统的&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&…...

Spring Cloud微服务性能优化:策略、实践与未来趋势

标题&#xff1a;Spring Cloud微服务性能优化&#xff1a;策略、实践与未来趋势 摘要 在微服务架构中&#xff0c;服务调用链路的性能优化是确保系统高效运行的关键。Spring Cloud作为微服务架构的主流实现之一&#xff0c;提供了多种工具和方法来优化服务间的调用。本文将深…...

秒懂C++之多态

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

C语言:求最大数不用数组

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

零门槛成为HelpLook推荐官,邀好友加入,奖励享不停!

什么&#xff01;&#xff1f; 还有谁不知道HelpLook推荐官计划&#xff01; 只需要简单地注册加入 在好友成功订阅套餐之后 可一次性获得20%的丰厚现金返佣 HelpLook是一款快速搭建AI知识库的系统&#xff0c;并帮助企业0代码搭建帮助中心、FAQs、SOPs、产品文档、说明书和…...

基于python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

利用formdata自动序列化和xhr上传表单到后端

//FormData对象是XMLHTTPRequest level2新增的类型&#xff0c;它可以自动序列化表单内容&#xff0c;不再需要我们去写序列化表单方法&#xff1b; FormData()即可以直接把整个表单给它&#xff0c;也可以分别使用append(‘字段’,‘值’)方法给FormData()&#xff1b; 现在就…...

视频号小店大地震?还好我看了原文

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我X&#xff0c;如果不是看了原文&#xff0c;我差点也上当了。虽然视频号小店关闭了450个类目&#xff0c;但又重新开放了412个类目啊。 昨天&#xff08;8月9日&#xff09;&#xff0c;视频号一口气发了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如何引领智能化革命

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正成为各大科技公司变革的重要驱动力。作为全球领先的社交媒体平台&#xff0c;Facebook&#xff08;现Meta Platforms&#xff09;正处于这一智能化革命的前沿。通过不断创新和应用AI技术&#xff0c;Facebook…...

嵌入式快速原型开发:基于Sceptre平台与LPC2148的实战指南

1. 项目概述&#xff1a;Sceptre&#xff0c;一个被低估的嵌入式快速原型利器 在嵌入式开发的世界里&#xff0c;我们总是在寻找那个“刚刚好”的平台&#xff1a;它要足够强大&#xff0c;能跑复杂的算法&#xff1b;要足够小巧&#xff0c;能塞进各种外壳&#xff1b;要足够便…...

美团外卖mtgsig与waimai_sign双层签名逆向解析

1. 这不是“爬虫教程”&#xff0c;而是一份反向工程现场笔记你搜到这篇内容&#xff0c;大概率正卡在某个调试窗口前&#xff1a;抓包看到mtgsig和waimai_sign两个参数像两堵墙&#xff0c;无论怎么改请求头、换UA、清缓存&#xff0c;返回永远是{"code":403,"…...

Windows文件夹共享

目标&#xff1a;同一局域网实现在一台计算机上共享文件夹&#xff0c;在另一台电脑访问一、电脑A 1.点击要共享的文件夹 -> 属性 -> 共享2.添加Everyone用户组3.控制面板中网络共享关闭密码保存&#xff0c;在访问时不用输入账号密码。二、电脑B 1.在文件资源管理器路径…...

股票买卖最佳时机:LeetCode121题解

题目LeetCode121给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取…...

CPU架构启发的智能仓储布局优化实践

1. 仓库布局优化的核心挑战与创新机遇在物流仓储领域&#xff0c;拣货环节通常占据运营成本的55%-65%&#xff0c;而其中约50%的时间消耗在无效行走路径上。传统矩形仓库布局虽然易于规划和施工&#xff0c;但其正交的通道设计导致拣货员需要频繁进行90度转向&#xff0c;这种&…...

PCL 基于强度的双边滤波【2026最新版】

目录 一、算法原理 1、计算步骤 2、算法源码 3、函数解析 4、参考文献 二、代码实现 三、结果展示 四、滤波后未发生变化的原因 五、解决办法 六、结果展示 七、相关链接 本文由CSDN点云侠原创,博客长期更新,本文最近一次更新时间为:2026年5月24日。 一、算法原理 1、计算…...

Qri高级功能:如何使用JSON Schema验证和描述数据集结构

Qri高级功能&#xff1a;如何使用JSON Schema验证和描述数据集结构 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一个强大的开源数据协作工具&#xff0c;它提供了丰富的功能来帮助用户管理、共享和验证…...

DeepSeek重复代码识别失效了?5个被90%团队忽略的AST解析盲区及修复清单

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek代码重复检测失效的真相与影响 DeepSeek-R1 模型在代码理解任务中表现出色&#xff0c;但其内置的代码重复检测机制在特定场景下存在系统性失效。根本原因在于模型对语义等价但语法结构差异显著的代…...

LoRa物联网与动态基线算法在养殖体温监测中的实战应用

1. 项目概述&#xff1a;为什么我们需要一个智能体温监测系统&#xff1f;在规模化养殖场里干了十几年&#xff0c;我见过太多因为体温异常没被及时发现而导致的损失。一头育肥猪突然不吃食&#xff0c;等饲养员第二天巡栏发现时&#xff0c;可能已经高烧好几天&#xff0c;继发…...

Arduino土壤湿度监测仪制作:从传感器原理到自动灌溉实现

1. 项目概述&#xff1a;用Arduino Uno和LCD屏打造你的土壤湿度监测仪作为一个喜欢在阳台种点番茄、辣椒的业余园丁&#xff0c;我经常为浇水这事儿头疼。浇多了怕烂根&#xff0c;浇少了又怕旱着&#xff0c;光靠手指插土里感觉&#xff0c;实在是不准。后来玩上了Arduino&…...