清风徐来
Michael's Blog
Demo 学 Echo Part7 Middleware 和 Logging

请输入图片描述 中间件是在处理http请求之前或之后调用的代码块。中间件通常按功能来做,例如:身份验证中间件,用于日志记录的中间件,用于gzip压缩的中间件等 跑一遍,来理解

package main

import (
	"fmt"
	"net/http"

	"github.com/labstack/echo"
)

func middlewareOne(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		fmt.Println("from middleware one")
		return next(c)
	}
}

func middlewareTwo(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		fmt.Println("from middleware two")
		return next(c)
	}
}

func main() {
	e := echo.New()

	// middleware here
	e.Use(middlewareOne)
	e.Use(middlewareTwo)

	e.GET("/index", func(c echo.Context) (err error) {
		fmt.Println("threeeeee!")

		return c.JSON(http.StatusOK, true)
	})

	e.Logger.Fatal(e.Start(":9000"))
}

客户端

curl http://localhost:9000/index
output=>true

服务端输出

http server started on [::]:9000
from middleware one
from middleware two
threeeeee!

集成第三方中间件:使用echo.WrapMiddleware()函数将中间件转换为echo兼容中间件,前提是必须采用func(http.Handler)http.Handler的形式来声明中间件。 例如

package main

import (
	"fmt"
	"net/http"

	"github.com/labstack/echo"
)

func middlewareSomething(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("from middleware something")
		next.ServeHTTP(w, r)
	})
}

func main() {
	e := echo.New()

	// middleware here
	e.Use(echo.WrapMiddleware(middlewareSomething))

	e.GET("/index", func(c echo.Context) (err error) {
		fmt.Println("threeeeee!")

		return c.JSON(http.StatusOK, true)
	})

	e.Logger.Fatal(e.Start(":9000"))
}

测试

#Client:
curl http://localhost:9000/index
true
#Server:
http server started on [::]:9000
from middleware something
threeeeee!

Echo 自己的 Middleware: Logger

package main

import (
	"net/http"

	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

func main() {
	e := echo.New()

	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
		Format: "method=${method}, uri=${uri}, status=${status}\n",
	}))

	e.GET("/index", func(c echo.Context) (err error) {
		return c.JSON(http.StatusOK, true)
	})

	e.Logger.Fatal(e.Start(":9000"))
}

运行一下 服务端按定义出现了一行记录

#Client:
curl http://localhost:9000/index
true
#Server:
http server started on [::]:9000
method=GET, uri=/index, status=200

最后修改于 2019-08-17