自定义中间件与洋葱模型进阶专项测试
💡 参考答案在文末
判断题
1
在Gin框架中,路由组的中间件只会影响该路由组内的路由,不会影响其他路由组或全局路由。而全局中间件会影响所有路由。
2
日志中间件应该放在中间件链的最前面(最先注册),这样才能记录完整的请求处理时间,包括认证失败等被中断的请求。
3
Gin框架的Recovery中间件只能捕获panic导致的错误,而错误处理中间件可以捕获业务逻辑中通过c.Error()记录的错误。两者互不替代,应该同时使用。
单选题
4
在Gin框架中,一个完善的日志中间件应该记录哪些关键信息?
5
在Gin中间件中,如果需要在某些条件下跳过后续中间件但仍执行后置逻辑,应该如何实现?
6
在Gin框架中,统一处理所有请求错误的推荐方式是?
7
在Gin框架中,中间件的最佳分层顺序是?
多选题
8
在Gin框架中实现错误处理中间件时,以下哪些是推荐的做法?
9
在Gin框架中实现性能监控中间件时,以下哪些指标是重要的?
10
在Gin框架中实现多层中间件嵌套时,以下哪些设计是推荐的?
11
在Gin框架中设计完整的请求处理链时,推荐的中间件分层和性能监控策略包括?
填空题
12
Gin框架的错误处理中间件实现:
Go
func ErrorHandler() gin.HandlerFunc {
return func(c *gin.Context) {
!!1_c.Next!!() // 执行后续处理
// 后置检查错误
if len(c.Errors) > 0 {
err := c.Errors.!!2_Last!!() // 获取最后一个错误
// 根据错误类型处理
switch err.!!3_Type!! {
case gin.ErrorTypePublic:
c.JSON(400, gin.H{"error": err.Error()})
case gin.ErrorTypePrivate:
c.JSON(500, gin.H{"error": "Internal Error"})
}
}
}
}
// 处理函数中添加错误
func Handler(c *gin.Context) {
if err != nil {
c.Error(err) // 添加错误到列表
}
}
13
Gin框架中间件嵌套的洋葱模型执行流程:
Go
r.Use(MiddlewareA())
r.Use(MiddlewareB())
r.GET("/test", Handler)
// MiddlewareA实现
func MiddlewareA() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("____________")
!!2_c.Next!!()
fmt.Println("____________")
}
}
// MiddlewareB实现
func MiddlewareB() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("B-前置")
c.Next()
fmt.Println("B-后置")
}
}
执行顺序输出:
text
A-前置 → B-前置 → Handler → B-后置 → A-后置
14
Gin框架的标准日志中间件实现:
Go
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始时间
!!1_start!! := time.Now()
// 执行后续处理
!!2_c.Next!!()
// 计算响应时间
latency := time.Since(!!1_start!!)
// 输出日志
log.Printf("%s %s %d %v",
c.Request.Method,
c.Request.URL.Path,
c.Writer.Status(),
latency,
)
}
}
参考答案
1.正确
2.正确
3.正确
4.B
5.B
6.C
7.A
8.A;B;C;D
9.A;B;C
10.A;C;D;E
11.A;D;E
12.c.Next;Last;Type
13.A-前置;c.Next;A-后置
14.start;start;c.Next
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码