【笔记】Beego学习笔记

前言

Beego is used for rapid development of enterprise application in Go, including RESTful APIs, web apps and backend services.(Github

手动管理Beego项目

下载依赖

1
go get github.com/beego/beego/v2@latest

引入依赖

1
import "github.com/beego/beego/v2/server/web"

主函数

main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"github.com/beego/beego/v2/server/web"
)

func main() {
web.Get("/", func(ctx *web.Context) {
ctx.WriteString("")
})

web.Run()
}

通过脚手架Bee管理Beego项目

下载脚手架

1
go install github.com/beego/bee/v2@master

初始化项目

创建Web项目

<project_name>:项目名

1
2
bee new <project_name>
cd <project_name>

创建API项目

1
2
bee api <project_name>
cd <project_name>

运行项目

1
bee run

打包项目

1
bee pack

配置文件

修改端口号

conf/app.conf
1
httpport = 8080

读取配置文件

1
beego.AppConfig.String("key")

路由

基础路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
11
12
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Get("/", func(context *context.Context) {})

beego.Post("/", func(context *context.Context) {})
}

固定路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/", &controllers.MainController{})
}
  • 匹配对应请求方法的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
...
}

func (c *MainController) Post() {
...
}

正则路由

匹配所有子路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/*", &controllers.MainController{})
}
  • 匹配对应请求方法的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
...
}

func (c *MainController) Post() {
...
}
匹配文件
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/*.*", &controllers.MainController{})
}
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
// 获取path参数
c.Ctx.Input.Param(":path")
// 获取扩展名
c.Ctx.Input.Param(":ext")
}

匹配path参数

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id", &controllers.MainController{})
}
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
// 获取path参数
c.Ctx.Input.Param(":id")
}
为参数指定正则表达式

[0-9]+:正则表达式

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id([0-9]+)", &controllers.MainController{})
}
为参数指定数据类型
匹配整型型参数
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id:int", &controllers.MainController{})
}
匹配字符串型参数
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id:string", &controllers.MainController{})
}

自定义路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
11
12
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/", &controllers.MainController{}, "GET:Select")

beego.Router("/", &controllers.MainController{}, "POST:Insert")
}
  • 匹配指定的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Select() {
...
}

func (c *MainController) Insert() {
...
}

控制器

  • 继承beego.Controller
controllers/MainController.go
1
2
3
type MainController struct {
beego.Controller
}

请求

获取请求参数

Get前缀函数

  • Get前缀函数会优先从query获取请求参数,然后从form获取请求参数,如果同时定义,form请求参数值会覆盖query请求参数值
将参数值转换为字符串
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetString("key")
}
将参数值转换为字符串切片
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetStrings("key")
}
将参数值转换为整型
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetInt("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetInt8("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetUint8("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetInt16("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetUint16("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetInt32("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetUint32("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetInt64("key")
}
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetUint64("key")
}
将参数值转换为浮点型
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetFloat("key")
}
将参数值转换为布尔型
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.GetBool("key")
}

Bind前缀函数

  • Bind前缀函数会将请求参数转换为结构体变量
自动反序列化
  • 根据请求头中的Content-Type自动反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.Bind(&user)
}
通过JSON反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.BindJSON(&user)
}
通过Form表单反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.BindForm(&user)
}
通过YAML反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.BindYAML(&user)
}
通过XML反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.BindXML(&user)
}
通过Protobuf反序列化
controllers/MainController.go
1
2
3
4
5
6
type User struct {}

func (c *MainController) Get() {
var user = User{}
c.BindProtobuf(&user)
}

获取文件

controllers/MainController.go
1
2
3
4
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
defer file.Close()
}

直接保存文件

controllers/MainController.go
1
2
3
4
5
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
defer file.Close()
c.SaveToFile("key", "static/upload/" + h.Filename)
}

再次打开文件

controllers/MainController.go
1
2
3
4
5
6
7
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
file.Close()
file.Seek(0, 0)
defer file.Close()
c.SaveToFile("key", "static/upload/" + h.Filename)
}

响应

响应文本内容

controllers/MainController.go
1
2
3
4
5
6
7
func (c *MainController) Get() {
// 定义相应头
c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/plain; charset=utf-8")

// 发送给客户端
c.Ctx.WriteString("文本内容")
}

响应JSON格式字符串

controllers/MainController.go
1
2
3
4
5
6
7
func (c *MainController) Get() {
// 定义JSON数据
c.Data["json"] = map[string]interface{}{}

// 发送给客户端
c.ServeJSON()
}

响应HTML文件

views/index.html
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文本内容</title>
</head>
<body>

</body>
</html>
controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.TplName = "index.html"
}

响应TPL模板文件

views/index.tpl
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ .key }}</title>
</head>
<body>

</body>
</html>
controllers/MainController.go
1
2
3
4
func (c *MainController) Get() {
c.Data["key"] = "value"
c.TplName = "index.tpl"
}

请求重定向

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.Redirect("/", 302)
}

未加密Cookie

设置Cookie

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.Ctx.SetCookie("key", "value")
}

maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
c.Ctx.SetCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)
}

获取Cookie

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
var value = c.Ctx.GetCookie("key")
}

加密Cookie

添加Cookie

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
var value = c.Ctx.SetSecureCookie("key", "value")
}

maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
var value = c.Ctx.SetSecureCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)
}

获取Cookie

controllers/MainController.go
1
2
3
func (c *MainController) Get() {
var value = c.Ctx.GetSecureCookie("key")
}

Session

配置Session

  • 可以使用代码或配置文件配置Session,使用一种方式即可

启用Session

conf/app.conf
1
sessionon = true
main.go
1
beego.BConfig.WebConfig.Session.SessionOn = true

Session数据存储方式

memory:缺省值,使用内存存储Session数据
file:使用文件存储Session数据

conf/app.conf
1
sessionprovider = "memory"
1
beego.BConfig.WebConfig.Session.SessionProvider = "memory"

Session数据存储路径

  • 如果使用文件存储Session数据,可以配置Session数据存储路径
conf/app.conf
1
sessionproviderconfig = "./tmp/"

Session的Cookie名称

conf/app.conf
1
sessionname = ""

Session过期时间

conf/app.conf
1
sessiongcmaxlifetime = 3600

Session的Cookie过期时间

3600:缺省值,单位秒

conf/app.conf
1
sessioncookielifetime = 3600

添加Session

1
2
3
func (c *MainController) Get() {
c.SetSession("key", "value")
}

删除Session

1
2
3
func (c *MainController) Get() {
c.DelSession("key")
}

获取Session

1
2
3
func (c *MainController) Get() {
var value = c.GetSession("key")
}

日志

调试

1
logs.Debug("文本内容%d", 1) // 2006/01/02 15:04:05 [Debug] [main.go:1] 文本内容1

信息

1
logs.Info("文本内容%d", 1) // 2006/01/02 15:04:05 [Info] [main.go:1] 文本内容1

警告

1
logs.Warn("文本内容%d", 1) // 2006/01/02 15:04:05 [Warn] [main.go:1] 文本内容1

错误

1
logs.Error("文本内容%d", 1) // 2006/01/02 15:04:05 [Error] [main.go:1] 文本内容1

严重错误

1
logs.Critical("文本内容%d", 1) // 2006/01/02 15:04:05 [Critical] [main.go:1] 文本内容1

完成

参考文献

beegodoc
哔哩哔哩——千锋Go语言学习营