day 5|中间件

本节目标:

  • 设计并实现 Web 框架的中间件(Middlewares)机制。

  • 实现通用的Logger中间件,能够记录请求到响应所花费的时间,代码约50行

中间件是啥

我们的框架不可能理解所有的业务,框架只是一个空空的躯体,他有什么具体的功能,需要我们去实现

这个时候,中间件就出来了,类似于一个插件,嵌入到框架中

对中间件需要考虑两个点:

  • 插入点在哪里,不能太底层了,那样逻辑会非常复杂

  • 中间件的参数决定了扩展能力

中间件设计

我们对Context对象进行设计,目的是框架接收初始化Context对象后,允许用户使用自己定义的中间件做一些额外的请求。

package geeimport ("log""time"
)func Logger() HandlerFunc {return func(c *Context) {//start timet := time.Now()//process request  等待用户自己定义的Handler处理结束c.Next()//caculate resolution timelog.Printf("[%d] %s in %v", c.StatusCode, c.Req.RequestURI, time.Since(t))}
}

注意我们支持设置多个中间件,一次进行调用

但是中间件应该复制在GROUP最顶层,这说明中间件需要有足够的功能通用性

中间件可以处理流程前,也可以处理流程后,而且中间件可能不止一个,所以我们要设计一个数组类型的HandlerFunc

type Context struct {// origin objectsWriter http.ResponseWriterReq    *http.Request// request infoPath   stringMethod stringParams map[string]string// response infoStatusCode int// middlewarehandlers []HandlerFunc//存储中间件index    int  //记录第几个中间件
}func newContext(w http.ResponseWriter, req *http.Request) *Context {return &Context{Path:   req.URL.Path,Method: req.Method,Req:    req,Writer: w,index:  -1,}
}func (c *Context) Next() {c.index++  //s := len(c.handlers)for ; c.index < s; c.index++ {c.handlers[c.index](c)}
}

在这一章里面,大家还是要去看一下源码,感觉文章里面有些东西没写清楚,特别是测试的main部分

这里测试的话不要使用curl工具,直接在网页上面访问url,服务端口才会有访问的时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

多线程之并发变成高级面试题-2024

有三个线程T1,T2,T3,如何保证顺序执行 使用 join() 方法&#xff1a; 可以在每个线程内部使用 join() 方法来等待前一个线程执行完成。具体操作是在线程 T2 的 run() 方法中调用 T1.join()&#xff0c;在线程 T3 的 run() 方法中调用 T2.join()。这样可以确保 T1 在 T2 之前执…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下&#xff0c;说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型 鸿蒙OS开发更多内容↓点击…

图像识别在工业检测中的应用

图像识别技术在工业检测中的应用非常广泛&#xff0c;它通过自动化的图像处理和分析&#xff0c;提高了生产效率、保证了产品质量&#xff0c;并降低了人力成本。以下是图像识别在工业检测中的一些主要应用领域&#xff1a; 缺陷检测&#xff1a;在制造业中&#xff0c;图像识…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub&#xff1a;WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

定时备份mysql数据库数据--mysqldump版

前言&#xff1a;mysqldump是MySQL自带的逻辑备份工具&#xff0c;可以将整个数据库或者指定的表格导出为一个SQL脚本文件&#xff0c;可以用于数据库备份。 1、编写shell脚本 # 备份文件保存路径 backup_dir/data/mysqlbackup # 当前时间 current_timedate %Y-%m-%d-%H-%M-%S…

git 更改仓库地址

背景&#xff1a; 项目本来在A仓库进行保管&#xff0c;研发已经开发一段时间了&#xff0c;现在切换到了新的仓库B&#xff0c;研发本地如何将仓库切换到B 解决&#xff1a; # 查看远端地址 git remote -v # 查看远端仓库名 git remote # 重新设置远程仓库 git remote s…

Linux---多线程(下)

前情提要&#xff1a;Linux---多线程(上) 七、互斥 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

3.28(迭代搜索算法 + java学习总结)

迭代加深搜索 迭代加深算法是一在DFS的基础上添加搜索深度限制的搜索方法&#xff1b; 其核心思想是从深度为0的地方开始搜索&#xff0c;然后逐步加深搜索深度&#xff0c;重新搜索一遍&#xff1b;这对于那些已知答案在浅层&#xff0c;但整个树或图存在极多分支的情况&#…

Selenium自动化测试:从time.sleep到显式等待的转变

在自动化测试的神秘世界里&#xff0c;我们的英雄——Selenium驾驶者&#xff0c;面临着一个古老的难题&#xff1a;如何等待&#xff1f;当然&#xff0c;最简单的法术是time.sleep&#xff0c;但这就像用锤子敲打每一个螺丝——有时候行得通&#xff0c;但并不总是最好的选择…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计&#xff0c;人力资源的环境搭建vue-element-admin的了解和…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息&#xff0c;可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档&#xff0c;刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中&#xff0c;使用上面的输出函数就可以查看到有关于请求…

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

【Vue】可拖拽侧边栏实现

在本篇博客中&#xff0c;我们将探讨如何在 Vue.js 项目中实现一个可拖拽的侧边栏。此功能可以通过修改 HTML 和 Vue 组件的脚本来实现。 首先&#xff0c;我们需要在 HTML 文件中定义侧边栏的容器和用于拖拽的元素。在 Vue 组件中&#xff0c;我们将使用 Vue 的响应式系统来追…