前言
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.go1 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>
|
运行项目
打包项目
配置文件
修改端口号
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() { ... }
|
控制器
controllers/MainController.go1 2 3
| type MainController struct { beego.Controller }
|
请求
获取请求参数
Get前缀函数
- Get前缀函数会优先从query获取请求参数,然后从form获取请求参数,如果同时定义,form请求参数值会覆盖query请求参数值
将参数值转换为字符串
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetString("key") }
|
将参数值转换为字符串切片
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetStrings("key") }
|
将参数值转换为整型
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetInt("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetInt8("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetUint8("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetInt16("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetUint16("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetInt32("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetUint32("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetInt64("key") }
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetUint64("key") }
|
将参数值转换为浮点型
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetFloat("key") }
|
将参数值转换为布尔型
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.GetBool("key") }
|
Bind前缀函数
自动反序列化
- 根据请求头中的
Content-Type自动反序列化
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.Bind(&user) }
|
通过JSON反序列化
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.BindJSON(&user) }
|
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.BindForm(&user) }
|
通过YAML反序列化
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.BindYAML(&user) }
|
通过XML反序列化
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.BindXML(&user) }
|
通过Protobuf反序列化
controllers/MainController.go1 2 3 4 5 6
| type User struct {}
func (c *MainController) Get() { var user = User{} c.BindProtobuf(&user) }
|
获取文件
controllers/MainController.go1 2 3 4
| func (c *MainController) Get() { file, header, err := c.GetFile("key") defer file.Close() }
|
直接保存文件
controllers/MainController.go1 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.go1 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.go1 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.go1 2 3 4 5 6 7
| func (c *MainController) Get() { c.Data["json"] = map[string]interface{}{}
c.ServeJSON() }
|
响应HTML文件
views/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>
|
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.TplName = "index.html" }
|
响应TPL模板文件
views/index.tpl1 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.go1 2 3 4
| func (c *MainController) Get() { c.Data["key"] = "value" c.TplName = "index.tpl" }
|
请求重定向
controllers/MainController.go1 2 3
| func (c *MainController) Get() { c.Redirect("/", 302) }
|
Cookie
未加密Cookie
设置Cookie
controllers/MainController.go1 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.go1 2 3
| func (c *MainController) Get() { c.Ctx.SetCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite) }
|
获取Cookie
controllers/MainController.go1 2 3
| func (c *MainController) Get() { var value = c.Ctx.GetCookie("key") }
|
加密Cookie
添加Cookie
controllers/MainController.go1 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.go1 2 3
| func (c *MainController) Get() { var value = c.Ctx.SetSecureCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite) }
|
获取Cookie
controllers/MainController.go1 2 3
| func (c *MainController) Get() { var value = c.Ctx.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 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.Critical("文本内容%d", 1)
|
完成
参考文献
beegodoc
哔哩哔哩——千锋Go语言学习营