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

Wonz · · 378 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、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)
}

展示如下:

image

通过 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("修改新闻")
}

显示

image

传入参数错误:

image

二、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")
}

显示效果:

image

输入ID、用户名和密码,勾选爱好:

image

然后点击提交,会通过 post 请求处理数据:

image

然后在控制台可以看到输出信息:

image

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")
}

显示:

image

输入用户名和密码,勾选爱好:

image

然后点击提交,会通过 post 请求处理数据:

image

然后在控制台可以看到输出信息:

image

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

image

三、参考教程

Golang 教程 P52-P53


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Wonz

查看原文:Beego 框架学习笔记 02 | Get、Post

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

378 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传