1環(huán)境準(zhǔn)備
命令行執(zhí)行
1.
go get github.com/beego/bee
2.
go get github.com/astaxie/beego
如果拋錯(cuò)超時(shí),則修改host文件,添加以下語句,然后使用ipconfig /flushdns刷新
# github訪問
# 69.171.224.40 github.global.ssl.fastly.net
# 185.199.111.153 assets-cdn.github.com
140.82.112.4 github.com
140.82.114.4 www.github.com
如果拋錯(cuò)連接錯(cuò)誤。則在環(huán)境變量中設(shè)置GOPROXY
GOPROXY=https://goproxy.cn,direct
然后下載最新的go壓縮包,直接替換掉之前的安裝包,重啟電腦
安裝好這些包后,將GOPATH/bin下的bee.exe路徑添加到環(huán)境變量
2 設(shè)置模板路徑
模板路徑默認(rèn)在views,如果需要設(shè)置成自定義路徑,有兩種方式
第一種是在main.go文件中的beego.Run()代碼前添加beego.SetViewsPath("html")代碼,html路徑即為自定義的路徑,第二種是在配置文件app.conf中設(shè)置,添加一行viewspath=html
如果不需要模板渲染,則可以在配置文件中配置autorender=false或者在main,go中配置beego.BConfig.WebConfig.AutoRender = false
beego.SetStaticPath("/static", "front")設(shè)置靜態(tài)文件位置,此句表示將url為static的指向front文件夾
3模板解析語法
模板解析后端數(shù)據(jù)使用{{.key}}進(jìn)行解析,其中的點(diǎn)不可缺失,代表解析的上下文。
4獲取get傳參
get傳參分為query和param兩種方式,每種方式都有兩種方式獲取參數(shù),query型可以使用p.GetString("name")或者p.Input().Get("name")獲取name參數(shù)的值。param使用p.GetString(":id")和p.Ctx.Input.Param(":id")獲取id參數(shù)的值
4.1獲取query型get傳參
傳參形式 /param?name=laowang
beego.Router("/param", &controllers.ParamController{})
type ParamController struct {
beego.Controller
}
func (p *ParamController) Get() {
//使用key=value形式傳參
name := p.GetString("name")
name2 := p.Input().Get("name")
p.Data["json"] = map[string]string{"name": name,
"input": name2}
p.ServeJSON()
}
4.2獲取param型get傳參
傳參形式/param/111
# 限制id為int類型
beego.Router("/param/?:id:int", &controllers.ParamController{})
# 不限制id類型
beego.Router("/param/?:id", &controllers.ParamController{})
type ParamController struct {
beego.Controller
}
func (p *ParamController) Get() {
//使用key=value形式傳參
//http://127.0.0.1:5000/param/111?name=liyuhu
id := p.GetString(":id")
id2 := p.Ctx.Input.Param(":id")
p.Data["json"] = map[string]string{"id": id, "inputId": id2}
p.ServeJSON()
}
5獲取form表單數(shù)據(jù)
5.1直接獲取form表單數(shù)據(jù)
直接獲取form表單數(shù)據(jù),可以通過p.GetString和p.Input()兩種方式獲取數(shù)據(jù)。獲取字符串使用GetString,獲取整型通過GetInt64,獲取浮點(diǎn)型通過GetFloat,獲取布爾型通過GetBool。除字符串獲取外,其他的獲取方式都是返回兩個(gè)值,一個(gè)獲取的值和error。
如果獲取的值與類型不匹配,則會(huì)使用默認(rèn)值(如price前端傳參為浮點(diǎn)型,應(yīng)該使用GetFloat獲取,而使用GetInt64去獲取,獲取的將是0這個(gè)默認(rèn)的int值)。
func (p *ParamController) Post() {
username := p.GetString("username")
age := p.Input().Get("age")
age1, _ := p.GetInt64("age")
price,_ := p.GetFloat("price")
price1,_ := p.GetInt64("price")
is_true,_ := p.GetBool("is_true")
p.Data["json"] = map[string]string{"username": username,
"age": age}
fmt.Println(age1, price, price1, is_true)
p.ServeJSON()
}
5.2解析數(shù)據(jù)到結(jié)構(gòu)體
解析form表單數(shù)據(jù)到結(jié)構(gòu)體,需要先定義結(jié)構(gòu)體,并使用``對(duì)其起別名,以保持與前端的傳參名一致。
定義好結(jié)構(gòu)體后,使用j.ParseForm獲取表單中的數(shù)據(jù),并傳入結(jié)構(gòu)體類型的變量指針。解析后的值就存入了結(jié)構(gòu)體類型的變量中。
type UserStruct struct {
Name string `form:"name"`
Age int `form:"age"`
}
func (j *JsonTestController) Post() {
user := UserStruct{}
err := j.ParseForm(&user)
if (err == nil) {
fmt.Println(user)
}
j.Data["json"] = user
j.ServeJSON()
}
5.3接收ajax傳輸?shù)臄?shù)據(jù)
若要接收ajax發(fā)送的數(shù)據(jù),需要在conf文件夾下的app.conf文件中添加如下設(shè)置
copyrequestbody=true
然后控制器中使用如下方式獲取數(shù)據(jù)
# 初始化一個(gè)結(jié)構(gòu)體變量
var user UserStruct
# 獲取ajax數(shù)據(jù)(為二進(jìn)制格式)
body := p.Ctx.Input.RequestBody
# 將二進(jìn)制數(shù)據(jù)解析到結(jié)構(gòu)體中
json.Unmarshal(body, &user)
p.Data["json"] = map[string]string{"name":"wang","type":"book"}
p.ServeJSON()
ajax傳輸數(shù)據(jù)時(shí),前端需要將數(shù)據(jù)格式轉(zhuǎn)換為與結(jié)構(gòu)體中字段對(duì)應(yīng)的格式(type),否則獲取不到值
5.4其他格式數(shù)據(jù)傳輸
5.4.1json格式數(shù)據(jù)傳輸
func (p *ParamController) Get() {
user := UserStruct{Id:1,UserName: "abc", Age: 12}
p.Data["json"] = &user
p.ServeJSON()
}
5.4.2xml格式傳輸
func (p *ParamController) Get() {
user := UserStruct{Id:1,UserName: "abc", Age: 12}
p.Data["xml"] = &user
p.ServeXML()
}
5.4.3jsonp格式
func (p *ParamController) Get() {
user := UserStruct{Id:1,UserName: "abc", Age: 12}
p.Data["jsonp"] = &user
p.ServeJSONP()
}
5.4.4yaml格式
func (p *ParamController) Get() {
user := UserStruct{Id:1,UserName: "abc", Age: 12}
p.Data["yaml"] = &user
p.ServeYAML()
}
6flash格式數(shù)據(jù)傳輸
在post中向flash中填入值,在get中獲取flash的值并返回不同的界面。
func (p *ParamController) Get() {
flash := beego.ReadFromRequest(&f.Controller)
notice := flash.Data("notice")
err := flash.Data("error")
if len(err)!=0{
p.TplName = "error.html"
} else if len(notice)!=0 {
p.TplName = "success.html"
}
}
func (p *ParamController) Post() {
flash := beego.NewFlash()
if
flash.Error("服務(wù)錯(cuò)誤")
flash.Notice("返回成功")
flash.Warning("數(shù)據(jù)可能有誤")
}