day 5|中间件

news/2024/4/29 2:43:23/文章来源:https://blog.csdn.net/m0_74107946/article/details/137124544

本节目标:

  • 设计并实现 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.luyixian.cn/news_show_1027199.aspx

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

相关文章

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

iOS开发进阶(十一):ViewController 控制器详解

文章目录 一、前言二、UIViewController三、UINavigationController四、UITabBarController五、UIPageViewController六、拓展阅读 一、前言 iOS 界面开发最重要的首属ViewController和View&#xff0c;ViewController是View的控制器&#xff0c;也就是一般的页面&#xff0c;…

蛋糕店怎么弄一个微信小程序_开启蛋糕店新篇章

微信小程序&#xff0c;开启蛋糕店新篇章——甜蜜触手可及 在这个数字化、智能化的时代&#xff0c;微信小程序以其便捷、高效的特点&#xff0c;成为了众多商家与消费者之间的桥梁。对于蛋糕店而言&#xff0c;拥有一个专属的微信小程序&#xff0c;不仅可以提升品牌形象&…

HTTP状态 405 - 方法不允许

方法有问题。 用Post发的请求&#xff0c;然后用Put接收的。 大家也可以看看是不是有这种问题 <body><h1>HTTP状态 405 - 方法不允许</h1><hr class"line" /><p><b>类型</b> 状态报告</p><p><b>消息…

Gitlab CI---could not read username for xxx: no such device or address

0 Preface/Foreword 项目开发中&#xff0c;经常会使用第三方的算法或者功能&#xff0c;那么就需要把对应的repo以子模块的方式添加到当前repo中。 添加命令&#xff1a; git submodule add <URL> 1 问题表现 子模块添加成功&#xff0c;但是GitLab CI阶段&#xff…

2024最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包

引言 在移动应用程序的开发中&#xff0c;了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法&#xff0c;可以让我们分析应用程序的网络请求和响应&#xff0c;了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具&#xff0c;可以帮助我们在 Android …

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…

新版Idea2023.3.5与lombok冲突、@Data失效

新版idea和lombok冲突&#xff0c;加上Data&#xff0c;其他地方get set也不报错&#xff0c;但是一运行就找不到get set方法。 但是直接使用Getter和Setter可以访问、应该是Data失效了。 解决方法&#xff1a; 看推上介绍是 lombok 与 idea 采集 get 、set 方法的时候所用的技…

FX110网:HYCM Europe 放弃 CIF 许可证,停止接受欧盟客户

FX110网获悉&#xff0c;外汇和差价合约交易平台HYCM&#xff08;Europe&#xff09;自愿放弃其CIF许可证。该公司在其网站上发布的一份声明中提到&#xff0c;将不再接受新客户或为欧盟境内的个人开设新账户。 HYCM Europe 写道&#xff1a;“HYCM (Europe) Limited&#xff0…

项目模块—实现抑郁测评(小程序)

script <script setup> import { ref } from "vue";//控制轮播图页码 let current ref(0);//答题逻辑 const add (value) > {if (current.value < 9) {current.value current.value 1;} else {uni.switchTab({url: "/pages/my/my",});} }…

vmware 安装 openEuler

获取openEuler 镜像文件 官网下载地址&#xff1a; https://www.openeuler.org/zh/download/?versionopenEuler%2022.03%20LTS%20SP3 下载ISO镜像 介绍一下三种软件包类型&#xff1a; Offline Standard ISO&#xff1a;基础镜像&#xff0c;包含运行最小系统的核心组件Offli…

2024.3.28学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p286-p294 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些…

如何使用OpenHarmony实现视频暂停、播放、切换、倍速播放

介绍 本篇Codelab使用ArkTS语言实现视频播放器&#xff0c;主要包括主页面和视频播放页面&#xff0c;我们将一起完成以下功能&#xff1a; 获取本地视频和网络视频。通过AVPlayer进行视频播放。通过手势调节屏幕亮度和视频播放音量。 相关概念 AVPlayer&#xff1a;播放管理…

力扣:字母迷宫,python

这里写自定义目录标题 问题描述题解踩坑记录global和nonlocal关键字的区别&#xff1a;类中可以用实例变量替换全局变量 问题描述 字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid&#xff0c;请判断玩家是否能在 grid 中找到目标单词 target。 注意&#xff1a;寻找单词…

比特币避险美元危机

作者&#xff1a;秦晋 最近&#xff0c;一张出自美联储的关于富人和穷人的财富分配的图表引发很多人疯传。图表的具体内容就是&#xff0c;美国最富有的0.1%的人所掌控的财富是美国最底层的50%的穷人的近4倍。前者0.1%的最富的人掌控财富近22万亿美元&#xff0c;后者50%最底层…

关于「技术开发技能」课程

本课程分为三个部分&#xff0c;带您了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发&#xff0c;您将能了解各类服务的优势、功能、典型使用案例、技术概念和成本。 学习任选的两个课程模块&#xff0c;并通过测验者&#xff0c;将授予「技术开发技能…

Python抓取抖音直播间数据:技术探索与实践

目录 一、引言 二、技术准备 三、分析抖音直播间网页结构 四、编写爬虫代码 五、处理反爬虫机制 六、数据清洗与存储 七、总结 一、引言 随着互联网的快速发展&#xff0c;直播行业已成为当下的热门领域。抖音作为其中的佼佼者&#xff0c;吸引了大量的用户和主播。对于…

学习总结3

解题思路 利用dfs进行遍历&#xff0c;直到无法遍历就把此次遍历解出的题目与最大值进行比较&#xff0c;遍历完后输出最大值。 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #inc…

itextPdf生成pdf简单示例

文章环境 jdk1.8&#xff0c;springboot2.6.13 POM依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.ite…

【嵌入式机器学习开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

ARM-Linux是一种针对ARM架构的操作系统&#xff0c;它的设计目标是在低功耗、低成本的硬件平台上运行。ARM-Linux可以运行在多种ARM处理器上&#xff0c;包括树莓派。 树莓派&#xff08;Raspberry Pi&#xff09;是一款基于ARM架构的单板计算机&#xff0c;由英国的树莓派基金…