Beego 框架学习笔记 02 | Get、Post
一、Get
article.go 里添加代码:
package controllers import ( "fmt" "github.com/astaxie/beego" ) type ArticleController struct { // 首字母要大写 beego.Controller } func (c *ArticleController) Get() { c.Ctx.WriteString("新闻列表") // 直接给页面返回数据 } func (c *ArticleController) AddArticle() { c.Ctx.WriteString("增加新闻") } func (c *ArticleController) EditArticle() { //获取 get 传值 id := c.GetString("id") fmt.Printf("值:%v 类型:%T", id, id) beego.Info(id) c.Ctx.WriteString("修改新闻" + id) }
展示如下:
通过 err
判断,获取 get 传值:
package controllers import ( "fmt" "github.com/astaxie/beego" ) type ArticleController struct { // 首字母要大写 beego.Controller } func (c *ArticleController) Get() { c.Ctx.WriteString("新闻列表") // 直接给页面返回数据 } func (c *ArticleController) AddArticle() { c.Ctx.WriteString("增加新闻") } func (c *ArticleController) EditArticle() { // 方法名称首字母必须大写 ////获取 get 传值 //id := c.GetString("id") //fmt.Printf("值:%v 类型:%T", id, id) //beego.Info(id) //c.Ctx.WriteString("修改新闻" + id) id, err := c.GetInt("id") if err!=nil{ beego.Info(err) c.Ctx.WriteString("传入参数错误") return } fmt.Printf("值:%v 类型:%T", id, id) c.Ctx.WriteString("修改新闻") }
显示
传入参数错误:
二、Post
user.go:
package controllers import ( "fmt" "github.com/astaxie/beego" "strconv" ) type UserController struct { // 首字母要大写 beego.Controller } func (c *UserController) Get() { c.Ctx.WriteString("用户中心") } func (c *UserController) AddUser() { c.TplName = "user.html" } // 处理 post 请求 获取 post 提交的数据 func (c *UserController) DoAddUser() { id, err := c.GetInt("id") if err != nil { c.Ctx.WriteString("id 必须是 int 类型") return } fmt.Printf("%v---%T", id, id) username := c.GetString("username") // 这里的 name 要和 html 中的 name 对应 password := c.GetString("password") hobby := c.GetStrings("hobby") fmt.Printf("值: %v---类型: %T", hobby, hobby) c.Ctx.WriteString("用户中心--" + strconv.Itoa(id) + username + password) }
user.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/user/doAdd" method="post"> ID <input type="text" name="id" /> <br><br> 用户名 <input type="text" name="username" /> <br><br> 密 码 <input type="password" name="password" /> <br><br> 爱 好 <input type="checkbox" value=1 id="label1" name="hobby"/> <label for="label1">吃饭</label> <input type="checkbox" value=2 id="label2" name="hobby"/> <label for="label2">睡觉</label> <input type="checkbox" value=3 id="label3" name="hobby"/> <label for="label3">敲代码</label> <input type="submit" value="提交"> </form> </body> </html>
router.go:
package routers import ( "beegodemo/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/goods", &controllers.GoodsController{}) // 结构体地址 beego.Router("/article", &controllers.ArticleController{}) // 访问 Get 方法 beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle") // 访问自定义方法 beego.Router("/article/edit", &controllers.ArticleController{}, "get:EditArticle") // 结构体地址 beego.Router("/user", &controllers.UserController{}) beego.Router("/user/add", &controllers.UserController{}, "get:AddUser") // 结构体地址 beego.Router("/user/doAdd", &controllers.UserController{}, "post:DoAddUser") }
显示效果:
输入ID、用户名和密码,勾选爱好:
然后点击提交,会通过 post 请求处理数据:
然后在控制台可以看到输出信息:
1. 使用 ParseForm
在 user.go 中增加了一个 User 结构体:
package controllers import ( "fmt" "github.com/astaxie/beego" "strconv" ) type UserController struct { // 首字母要大写 beego.Controller } func (c *UserController) Get() { c.Ctx.WriteString("用户中心") } func (c *UserController) AddUser() { c.TplName = "userAdd.html" } // 处理 post 请求 获取 post 提交的数据 func (c *UserController) DoAddUser() { id, err := c.GetInt("id") if err != nil { c.Ctx.WriteString("id 必须是 int 类型") return } fmt.Printf("%v---%T", id, id) username := c.GetString("username") // 这里的 name 要和 html 中的 name 对应 password := c.GetString("password") hobby := c.GetStrings("hobby") fmt.Printf("值: %v---类型: %T", hobby, hobby) c.Ctx.WriteString("用户中心--" + strconv.Itoa(id) + username + password) } func (c *UserController) EditUser() { c.TplName = "userEdit.html" } // 定义一个 User 的结构体 type User struct { Username string `form:"username"` // html 中 name 是小写,所以这里需要使用 `` 来定义 tag 标签 Password string `form:"password"` Hobby []string `form:"hobby"` } func (c *UserController) DoEditUser() { u := User{} if err := c.ParseForm(&u); err != nil { c.Ctx.WriteString("post 提交失败") return } fmt.Printf("%#v", u) c.Ctx.WriteString("解析 post 数据成功") }
userEdit.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>编辑用户</h2> <form action="/user/doEdit" method="post"> 用户名 <input type="text" name="username" /> <br><br> 密 码 <input type="password" name="password" /> <br><br> 爱 好 <input type="checkbox" value=1 id="label1" name="hobby"/> <label for="label1">吃饭</label> <input type="checkbox" value=2 id="label2" name="hobby"/> <label for="label2">睡觉</label> <input type="checkbox" value=3 id="label3" name="hobby"/> <label for="label3">敲代码</label> <input type="submit" value="提交"> </form> </body> </html>
router.go:
package routers import ( "beegodemo/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/goods", &controllers.GoodsController{}) // 结构体地址 beego.Router("/article", &controllers.ArticleController{}) // 访问 Get 方法 beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle") // 访问自定义方法 beego.Router("/article/edit", &controllers.ArticleController{}, "get:EditArticle") // 结构体地址 beego.Router("/user", &controllers.UserController{}) beego.Router("/user/add", &controllers.UserController{}, "get:AddUser") // 结构体地址 beego.Router("/user/doAdd", &controllers.UserController{}, "post:DoAddUser") beego.Router("/user/edit", &controllers.UserController{}, "get:EditUser") // 结构体地址 beego.Router("/user/doEdit", &controllers.UserController{}, "post:DoEditUser") }
显示:
输入用户名和密码,勾选爱好:
然后点击提交,会通过 post 请求处理数据:
然后在控制台可以看到输出信息:
2. 返回 json 数据
在 user.go 中增加 GetUser 函数:
package controllers import ( "fmt" "github.com/astaxie/beego" "strconv" ) type UserController struct { // 首字母要大写 beego.Controller } func (c *UserController) Get() { c.Ctx.WriteString("用户中心") } func (c *UserController) AddUser() { c.TplName = "userAdd.html" } // 处理 post 请求 获取 post 提交的数据 func (c *UserController) DoAddUser() { id, err := c.GetInt("id") if err != nil { c.Ctx.WriteString("id 必须是 int 类型") return } fmt.Printf("%v---%T", id, id) username := c.GetString("username") // 这里的 name 要和 html 中的 name 对应 password := c.GetString("password") hobby := c.GetStrings("hobby") fmt.Printf("值: %v---类型: %T", hobby, hobby) c.Ctx.WriteString("用户中心--" + strconv.Itoa(id) + username + password) } func (c *UserController) EditUser() { c.TplName = "userEdit.html" } // 定义一个 User 的结构体 type User struct { Username string `form:"username"` // html 中 name 是小写,所以这里需要使用 `` 来定义 tag 标签 Password string `form:"password"` Hobby []string `form:"hobby"` } func (c *UserController) DoEditUser() { u := User{} if err := c.ParseForm(&u); err != nil { c.Ctx.WriteString("post 提交失败") return } fmt.Printf("%#v", u) c.Ctx.WriteString("解析 post 数据成功") } // 在 beego 中,如果我们需要返回一个 json 数据,需要把数据放在结构体中 func (c *UserController) GetUser () { u := User{ Username: "张三", Password: "123456", Hobby: []string{"1", "2"}, } // 返回一个 json 数据 c.Data["json"] = u c.ServeJSON() }
router.go:
package routers import ( "beegodemo/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/goods", &controllers.GoodsController{}) // 结构体地址 beego.Router("/article", &controllers.ArticleController{}) // 访问 Get 方法 beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle") // 访问自定义方法 beego.Router("/article/edit", &controllers.ArticleController{}, "get:EditArticle") // 结构体地址 beego.Router("/user", &controllers.UserController{}) beego.Router("/user/add", &controllers.UserController{}, "get:AddUser") // 结构体地址 beego.Router("/user/doAdd", &controllers.UserController{}, "post:DoAddUser") beego.Router("/user/edit", &controllers.UserController{}, "get:EditUser") // 结构体地址 beego.Router("/user/doEdit", &controllers.UserController{}, "post:DoEditUser") beego.Router("/user/getUser", &controllers.UserController{}, "get:GetUser") // 首字母大写 }
在浏览器输入 http://localhost:8080/user/getUser
,可以看到:
三、参考教程
Go学习笔记 文章被收录于专栏
自己学习 Go 语言记录的笔记。