0

0

如何在 Martini 的 RecoverWrap 中获取当前请求的 URL

花韻仙語

花韻仙語

发布时间:2026-01-24 12:11:19

|

419人浏览过

|

来源于php中文网

原创

如何在 Martini 的 RecoverWrap 中获取当前请求的 URL

在 martini 框架中,可通过为 `recoverwrap` 中间件函数添加 `*http.request` 参数,直接注入并访问 `req.url.path` 或完整 url,从而在 panic 恢复时准确记录出错路径(如 `/panic`),便于错误追踪与告警。

Martini 采用依赖注入机制,中间件函数的参数会由框架自动解析并注入对应类型的实例。*http.Request 正是可被自动注入的标准类型之一——只要将其声明为 RecoverWrap 函数的参数,即可在 defer 恢复逻辑中安全使用。

以下是一个完整、可运行的示例,展示了如何在 panic 捕获阶段获取并打印请求 URL:

package main

import (
    "errors"
    "fmt"
    "github.com/go-martini/martini"
    "net/http"
)

func main() {
    m := martini.Classic()
    m.Use(RecoverWrap)
    m.Get("/panic", func() {
        panic("some panic")
    })
    m.Get("/", func(res http.ResponseWriter) {
        res.Write([]byte("mainPage"))
    })
    m.Run()
}

func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter) {
    var err error
    defer func(w http.ResponseWriter) {
        r := recover()
        if r != nil {
            switch t := r.(type) {
            case string:
                err = errors.New(t)
            case error:
                err = t
            default:
                err = errors.New("Unknown error")
            }

            // ✅ 安全获取当前请求路径
            fullPath := req.URL.Path
            query := req.URL.RawQuery
            fullURL := req.URL.String() // 包含 scheme/host(需注意:本地开发时可能为 /path?...,实际部署建议结合 req.Host 和 req.TLS 判断)

            fmt.Printf("❌ Panic occurred at URL: %s\n", fullURL)
            fmt.Printf("   Path: %s, Query: %s\n", fullPath, query)

            // 示例:此处可集成邮件发送逻辑(如使用 net/smtp)
            // sendAlertEmail(fmt.Sprintf("Panic on %s: %v", fullURL, err))

            http.Error(w, "Something went wrong", http.StatusInternalServerError)
        }
    }(w)
    c.Next()
}

⚠️ 注意事项:

Android配合WebService访问远程数据库 中文WORD版
Android配合WebService访问远程数据库 中文WORD版

采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,

下载
  • req.URL.String() 在 Martini 中默认仅返回路径+查询参数(如 /panic?debug=1),不包含协议和主机名。若需完整 URL(如 http://localhost:3000/panic),需手动拼接:fmt.Sprintf("%s://%s%s", getScheme(req), req.Host, req.URL.RequestURI()),其中 getScheme 可根据 req.TLS != nil 判断为 https 或 http。
  • *http.Request 必须作为 RecoverWrap 的显式参数声明,顺序无关紧要(Martini 按类型匹配),但建议放在 c martini.Context 之后、w http.ResponseWriter 之前,符合常见阅读习惯。
  • 不应在 defer 中调用 w.Write 或修改响应头(http.Error 已处理),避免重复写入导致 http: multiple response.WriteHeader calls 错误。

通过这一方式,你不仅能精准定位异常发生的路由,还能将 req 扩展用于日志上下文、用户标识、IP 记录等运维增强场景,显著提升错误排查效率。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

214

2025.12.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2023.10.25

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

416

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2079

2024.03.12

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号