Beego 框架学习笔记 02 | Get、Post

孤街浪徒 提交于 2020-12-16 23:27:36

一、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,可以看到:

三、参考教程

Golang 教程 P52-P53

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!