第十二節(jié) beego

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ù)可能有誤")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容