前言
Beego学习笔记
下载依赖
1
| go get github.com/astaxie/beego
|
引入依赖
1
| import "github.com/astaxie/beego"
|
启动服务
- 解析配置文件
- 检查是否开启Session
- 是否预编译HTML模板文件,将HTML模板文件预编译并以Map结构存储到内存中
- 监听端口,启动服务
命令行工具
安装
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| + conf // 存放配置文件 - app.conf // 核心配置文件 + controllers // 存放控制器 + models // 存放实体 + routers // 存放路由 - router.go // 核心路由文件 + static // 存放静态资源 + css // 存放CSS文件 + img // 存放图片 + js // 存放JS文件 + tests // 存放测试文件 - default_test.go // 默认测试文件 + views // 存放HTML模板 - index.tpl // 默认HTML模板 - go.mod - main.go
|
配置文件
修改端口号
conf/app.conf
读取配置文件
1
| beego.AppConfig.String("key")
|
路由
基础路由
routers/router.go1 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.go1 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.go1 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.go1 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.go1 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.go1 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.go1 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() { c.Ctx.Input.Param(":path") c.Ctx.Input.Param(":ext") }
|
匹配path参数
routers/router.go1 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.go1 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() { c.Ctx.Input.Param(":id") }
|
为参数指定正则表达式
[0-9]+:正则表达式
routers/router.go1 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.go1 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.go1 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.go1 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.go1 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() { ... }
|
Controller
1 2 3
| type MainController struct { beego.Controller }
|
接收请求
获取请求参数
Get前缀函数
- Get前缀函数会优先从query获取请求参数,然后从form获取请求参数,如果同时定义,form请求参数值会覆盖query请求参数值
将参数值转换为字符串
1 2 3
| func (c *MainController) Get() { c.GetString("key") }
|
将参数值转换为字符串切片
1 2 3
| func (c *MainController) Get() { c.GetStrings("key") }
|
将参数值转换为整型
1 2 3
| func (c *MainController) Get() { c.GetInt("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetInt8("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetUint8("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetInt16("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetUint16("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetInt32("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetUint32("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetInt64("key") }
|
1 2 3
| func (c *MainController) Get() { c.GetUint64("key") }
|
将参数值转换为浮点型
1 2 3
| func (c *MainController) Get() { c.GetFloat("key") }
|
将参数值转换为布尔型
1 2 3
| func (c *MainController) Get() { c.GetBool("key") }
|
Bind前缀函数
定义结构体
1 2
| type User struct {} var user = User{}
|
自动反序列化
- 根据请求头中的
Content-Type自动反序列化
1 2 3
| func (c *MainController) Get() { c.Bind(&user) }
|
通过JSON反序列化
1 2 3
| func (c *MainController) Get() { c.BindJSON(&user) }
|
1 2 3
| func (c *MainController) Get() { c.BindForm(&user) }
|
通过YAML反序列化
1 2 3
| func (c *MainController) Get() { c.BindYAML(&user) }
|
通过XML反序列化
1 2 3
| func (c *MainController) Get() { c.BindXML(&user) }
|
通过Protobuf反序列化
1 2 3
| func (c *MainController) Get() { c.BindProtobuf(&user) }
|
获取文件
1 2 3 4
| func (c *MainController) Get() { file, header, err := c.GetFile("key") defer file.Close() }
|
直接保存文件
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) }
|
再次打开文件
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) }
|
返回响应
响应文本内容
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格式字符串
1 2 3 4 5 6 7
| func (c *MainController) Get() { c.Data["json"] = map[string]interface{}{}
c.ServeJSON() }
|
响应HTML文件
index.html1 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>
|
1 2 3
| func (c *MainController) Get() { c.TplName = "index.html" }
|
响应HTML模板
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>
|
1 2 3 4 5 6 7
| func (c *MainController) Get() { c.Data["key"] = "value"
c.TplName = "index.tpl" }
|
请求重定向
1 2 3
| func (c *MainController) Get() { c.Redirect("/", 302) }
|
Cookie
设置Cookie
1
| context.SetCookie("key", "value")
|
maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone
1
| context.SetCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)
|
获取Cookie
1
| context.GetCookie("key")
|
加密Cookie
添加Cookie
1
| context.SetSecureCookie("key", "value")
|
maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone
1
| context.SetSecureCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)
|
获取Cookie
1
| context.GetSecureCookie("key")
|
Session
配置Session
- 可以使用代码或配置文件配置Session,使用一种方式即可
启用Session
conf/app.conf
main.go1
| beego.BConfig.WebConfig.Session.SessionOn = true
|
Session数据存储方式
memory:缺省值,使用内存存储Session数据
file:使用文件存储Session数据
conf/app.conf1
| sessionprovider = "memory"
|
1
| beego.BConfig.WebConfig.Session.SessionProvider = "memory"
|
Session数据存储路径
- 如果使用文件存储Session数据,可以配置Session数据存储路径
conf/app.conf1
| sessionproviderconfig = "./tmp/"
|
Session的Cookie名称
conf/app.conf
Session过期时间
conf/app.conf1
| sessiongcmaxlifetime = 3600
|
Session的Cookie过期时间
3600:缺省值,单位秒
conf/app.conf1
| sessioncookielifetime = 3600
|
添加Session
1
| c.SetSession("key", "value")
|
删除Session
获取Session
1
| var value = c.GetSession("key")
|
HTTP模板
条件语句
1 2 3
| {{if .key}} ... {{end}}
|
日志
调试
信息
警告
错误
严重错误
完成
参考文献
beegodoc
哔哩哔哩——千锋Go语言学习营