|
|
@ -4,7 +4,8 @@ |
|
|
|
|
|
|
|
|
|
|
|
# 写自己的中间件 |
|
|
|
# 写自己的中间件 |
|
|
|
|
|
|
|
|
|
|
|
middleware本质上就是一个handler,如下代码: |
|
|
|
middleware本质上就是一个handler,接口和方法声明如下代码: |
|
|
|
|
|
|
|
|
|
|
|
```go |
|
|
|
```go |
|
|
|
// Handler responds to an HTTP request. |
|
|
|
// Handler responds to an HTTP request. |
|
|
|
type Handler interface { |
|
|
|
type Handler interface { |
|
|
@ -21,7 +22,7 @@ func (f HandlerFunc) ServeHTTP(c *Context) { |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
1. 实现了`Handler`接口,可以作为engine的全局中间件使用:`engine.Use(YourHandler)` |
|
|
|
1. 实现了`Handler`接口,可以作为engine的全局中间件使用:`engine.Use(YourHandler)` |
|
|
|
2. 声明为`HandlerFunc`方法,可以作为router的局部中间件使用:`e.GET("/path", YourHandlerFunc)` |
|
|
|
2. 声明为`HandlerFunc`方法,可以作为engine的全局中间件使用:`engine.UseFunc(YourHandlerFunc)`,也可以作为router的局部中间件使用:`e.GET("/path", YourHandlerFunc)` |
|
|
|
|
|
|
|
|
|
|
|
简单示例代码如下: |
|
|
|
简单示例代码如下: |
|
|
|
|
|
|
|
|
|
|
@ -42,16 +43,17 @@ d := &Demo{} |
|
|
|
e.Use(d) |
|
|
|
e.Use(d) |
|
|
|
|
|
|
|
|
|
|
|
// HandlerFunc使用如下: |
|
|
|
// HandlerFunc使用如下: |
|
|
|
|
|
|
|
e.UseFunc(d.ServeHTTP) |
|
|
|
e.GET("/path", d.ServeHTTP) |
|
|
|
e.GET("/path", d.ServeHTTP) |
|
|
|
|
|
|
|
|
|
|
|
// 或者只有方法 |
|
|
|
// 或者只有方法 |
|
|
|
myHandler := func(ctx *bm.Context) { |
|
|
|
myHandler := func(ctx *bm.Context) { |
|
|
|
// some code |
|
|
|
// some code |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
e.UseFunc(myHandler) |
|
|
|
e.GET("/path", myHandler) |
|
|
|
e.GET("/path", myHandler) |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 全局中间件 |
|
|
|
# 全局中间件 |
|
|
|
|
|
|
|
|
|
|
|
在blademaster的`server.go`代码中,有以下代码: |
|
|
|
在blademaster的`server.go`代码中,有以下代码: |
|
|
@ -64,19 +66,17 @@ func DefaultServer(conf *ServerConfig) *Engine { |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
会默认创建一个bm engine,并注册`Recovery(), Trace(), Logger()`三个middlerware,用于全局handler处理。优先级从前到后。 |
|
|
|
会默认创建一个`bm engine`,并注册`Recovery(), Trace(), Logger()`三个middlerware用于全局handler处理,优先级从前到后。如果想要将自定义的middleware注册进全局,可以继续调用Use方法如下: |
|
|
|
如果需要自定义默认全局执行的middleware,可以使用`NewServer`方法创建一个无middleware的engine对象。 |
|
|
|
|
|
|
|
如果想要将自定义的middleware注册进全局,可以继续调用Use方法如下: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```go |
|
|
|
```go |
|
|
|
engine.Use(YourMiddleware()) |
|
|
|
engine.Use(YourMiddleware()) |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
此方法会将`YourMiddleware`追加到已有的全局middleware后执行。 |
|
|
|
此方法会将`YourMiddleware`追加到已有的全局middleware后执行。如果需要全部自定义全局执行的middleware,可以使用`NewServer`方法创建一个无middleware的engine对象,然后使用`engine.Use/UseFunc`进行注册。 |
|
|
|
|
|
|
|
|
|
|
|
# 局部中间件 |
|
|
|
# 局部中间件 |
|
|
|
|
|
|
|
|
|
|
|
先来看一段示例(代码再pkg/net/http/blademaster/middleware/auth模块下): |
|
|
|
先来看一段鉴权伪代码示例([auth示例代码位置](https://github.com/bilibili/kratos/tree/master/example/blademaster/middleware/auth)): |
|
|
|
|
|
|
|
|
|
|
|
```go |
|
|
|
```go |
|
|
|
func Example() { |
|
|
|
func Example() { |
|
|
|