Gin-Gonic 中间件声明
Gin-Gonic middleware declaration
我正在使用 Gin-Gonic 并且正在创建自定义中间件。参见:https://github.com/gin-gonic/gin#custom-middleware
文档中的中间件这样写是不是有什么原因:
func MyMiddleware() gin.HandlerFunc {
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
当我可以简单地这样写的时候:
func MyMiddleware(c *gin.Context) {
// middleware
}
r := gin.New()
r.Use(MyMiddleware)
感谢您的帮助!
如果您愿意,当然可以这样做:
func MyMiddleware(c *gin.Context) {
// middleware
}
r := gin.New()
r.Use(MyMiddleware)
建议您改为这样做的最可能原因:
func MyMiddleware() gin.HandlerFunc {
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
是,所以可以加参数,这里用的例子:https://github.com/gin-gonic/gin#custom-middleware是一个日志中间件。:
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// code goes here
}
}
它没有任何参数,但您可以通过添加参数在中间件中使用像 logrus 这样的自定义记录器:
你可以有这样一个日志记录中间件:
func Logger(log *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
// use logrus
log.WithFields(log.Fields{
"animal": "walrus",
}).Info("A walrus appears")
}
}
并像这样使用它:
var log = logrus.New()
r.Use(Logger(log))
是的,你可以。
有时中间件需要参数。例如:
MyMiddleware(foo string) gin.HandlerFunc {
// preprocess with argument foo
return func(c *gin.Context) {
// do something related with foo...
}
}
以gin.BasicAuthForRealm为例。在检查来自 HTTP 请求的授权之前,您必须向其提供授权数据。
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc {
// ...
}
对于没有参数的中间件,我认为他们只是想保持相同的格式。
返回函数的变体还可以允许中间件执行一些初始化,如果需要的话:
func MyMiddleware() gin.HandlerFunc {
// Perform initialization here...
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
该初始化只会执行一次(当中间件附加到请求时),而不是对每个请求都执行。
如果您正在编写需要初始化的中间件,但您无法控制其他人如何使用它,这可能很有用。
我正在使用 Gin-Gonic 并且正在创建自定义中间件。参见:https://github.com/gin-gonic/gin#custom-middleware
文档中的中间件这样写是不是有什么原因:
func MyMiddleware() gin.HandlerFunc {
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
当我可以简单地这样写的时候:
func MyMiddleware(c *gin.Context) {
// middleware
}
r := gin.New()
r.Use(MyMiddleware)
感谢您的帮助!
如果您愿意,当然可以这样做:
func MyMiddleware(c *gin.Context) {
// middleware
}
r := gin.New()
r.Use(MyMiddleware)
建议您改为这样做的最可能原因:
func MyMiddleware() gin.HandlerFunc {
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
是,所以可以加参数,这里用的例子:https://github.com/gin-gonic/gin#custom-middleware是一个日志中间件。:
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// code goes here
}
}
它没有任何参数,但您可以通过添加参数在中间件中使用像 logrus 这样的自定义记录器:
你可以有这样一个日志记录中间件:
func Logger(log *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
// use logrus
log.WithFields(log.Fields{
"animal": "walrus",
}).Info("A walrus appears")
}
}
并像这样使用它:
var log = logrus.New()
r.Use(Logger(log))
是的,你可以。
有时中间件需要参数。例如:
MyMiddleware(foo string) gin.HandlerFunc {
// preprocess with argument foo
return func(c *gin.Context) {
// do something related with foo...
}
}
以gin.BasicAuthForRealm为例。在检查来自 HTTP 请求的授权之前,您必须向其提供授权数据。
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc {
// ...
}
对于没有参数的中间件,我认为他们只是想保持相同的格式。
返回函数的变体还可以允许中间件执行一些初始化,如果需要的话:
func MyMiddleware() gin.HandlerFunc {
// Perform initialization here...
return func (c *gin.Context) {
// middleware
}
}
r := gin.New()
r.Use(MyMiddleware())
该初始化只会执行一次(当中间件附加到请求时),而不是对每个请求都执行。
如果您正在编写需要初始化的中间件,但您无法控制其他人如何使用它,这可能很有用。