Flamego

Flamego是一个路由强大的Web框架,通过注入实现灵活的扩展。

基础

  • 实例(实现了http.Handler接口)
    • Flamego.Classic 经典实例,包含Recovery,Logger,Static三个中间件
    • Flame.New
  • 路由
    • f.Get
    • f.Group
  • 启动
    • f.Run(8000) : 默认2830
    • f.Run(“127.0.0.1:2830”)
    • http.ListenAndServe(“0.0.0.0:2830”,f)
    • http.ListenAndServeTLS(“localhost:8888”, “certFile”, “keyFile”, f)

请求和响应流

路由支持多个处理器,通过Next()出让给下一个处理器。

Context上下文

flamego.Context 是请求上下文的容器,仅适用于路由层

支持的方法:

  • Param()/ParamInt()/…
  • Query()/QueryInt()/QueryStrings() : URL参数,支持设置默认值,其他借助于c.Request().URL.Query()
  • RemoteAddr() 客户端地址
  • Redirect()

请求

获取请求带2种方式:

  • func(r *http.Request)
  • func(c flamego.Context)
    • c.Request()http.Request的封装,提供了额外的辅助方法
// req.Body()
body := c.Request().Body().Bytes()

响应

两种获取方式:

  • 处理器参数 w http.ResponseWriter
  • 调用请求上下文 c.ResponseWriter()

处理器返回值可以是:

  • 字符串、[]byte
  • 字符串和error:如果error不为空,直接返回错误

用Render中间件渲染内容

f.Use(flamego.Renderer(
		flamego.RenderOptions{
			JSONIndent: "  ",
		},
	))
	f.Get("/", func(r flamego.Render) {
		r.JSON(http.StatusOK,
			map[string]interface{}{
				"id":       1,
				"username": "xulz",
			},
		)
	})

中间件

部分官方中间件:

  • session
  • cache
  • auth
  • binding
  • cors

日志

默认日系使用 *log.Logger

f.Get("/", func(log *log.Logger) {
		log.Println("Hello, Flamego!")
	})

Panic恢复

经典实例内置 flamego.Recovery()

Panic时会输出错误信息而不是崩溃.

静态资源

处理静态资源涉及两种用法:

  • 本地静态目录
  • 内嵌静态文件系统
// 示例值都是默认值
f.Use(flamego.Static(
		flamego.StaticOptions{
			Directory: "/public",
			Index:     "index.html",
			Prefix:    "",
		},

内嵌文件系统:

限制:必须带文件夹路径访问URL

//go:embed css
var css embed.FS

f.Use(flamego.Static(
		flamego.StaticOptions{
			FileSystem: http.FS(css),
		},
	))

自定义服务

可以为处理器增加注入服务,已内置于flamego.Flame和flamego.Context。 两种注入方式:

  • Map(具体的类型或接口)
  • MapTo: 注入为其实现的某一接口的方法

注入服务

全局服务

  • Flame实例的Map或MapTo
  • Use在全局中间件中注入

组级服务

f.Group()被组内所有路由器的处理器使用

路由级服务

仅该路由绑定的处理器使用

重载服务

可重载已注入的服务变更服务的状态或行为。