• Beego 使用教程 6:Web 输入处理


    beego 是一个用于Go编程语言的开源、高性能的 web 框架

    beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask

    beego 官网:http://beego.gocn.vip/

    上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》

    注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了

    beego 官方 github 仓库:https://github.com/beego/beego

    上一讲,讲了 beego 页面视图,需要的朋友可以查看《Beego 使用教程 5:页面视图》

    这一讲,讲解 web 输入处理,这一讲的 web输入需要借助上一讲的页面

    代码使用上一讲的代码

    目录

    1、Get 类方法

    1.1、路由传参

    1.2、表单请求

    1.3、传入默认值

    1.4、post 请求

    2、Bind 类方法


    1、Get 类方法

    1.1、路由传参

    路由传参,在前面第3讲中已经以参数路由的形式讲解过了,这里再简单讲解一下控制器风格的路由参数,更多内容不在赘述,需要的朋友可以看《Beego 使用教程 3:Web 模块之路由》中参数路由部分内容

    在 controller 目录下新建 param.go,内容是下面代码

    1. package controller
    2. import (
    3. "github.com/beego/beego/v2/server/web"
    4. )
    5. type ParamController struct {
    6. web.Controller
    7. }
    8. func (p *ParamController) PathParam() {
    9. name := p.Ctx.Input.Param(":name")
    10. p.Ctx.WriteString(name)
    11. }

    修改 main.go 为下面代码,添加PathParam 的路由

    1. package main
    2. import (
    3. "beego-demo/controller"
    4. "beego-demo/filter"
    5. "fmt"
    6. "github.com/beego/beego/v2/core/config"
    7. "github.com/beego/beego/v2/server/web"
    8. )
    9. func main() {
    10. //通过config获取自定义配置
    11. workername, _ := config.String("workername")
    12. fmt.Println(workername)
    13. //执行定时任务
    14. //go job.DemoTask()
    15. //注册自动路由
    16. //web.AutoPrefix("api", &controller.UserController{})
    17. web.CtrlGet("/name", (*controller.UserController).Name)
    18. web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
    19. web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
    20. //返回页面
    21. web.CtrlGet("/page/index", (*controller.PageController).Index)
    22. web.CtrlGet("/page/f", (*controller.PageController).F)
    23. web.CtrlGet("/page/main", (*controller.PageController).Main)
    24. //web输入参数
    25. web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
    26. //注册函数式路由
    27. controller.RegisterFunctionalRoutes()
    28. //web命名空间
    29. controller.RegisterNamespaceRoutes()
    30. //过滤器
    31. filter.RegisterFilters()
    32. //开启 Admin 管理后台
    33. web.BConfig.Listen.EnableAdmin = true
    34. web.BConfig.Listen.AdminAddr = "localhost"
    35. web.BConfig.Listen.AdminPort = 8088
    36. //web.BConfig.WebConfig.ViewsPath = "pages"
    37. //查看已注册路由
    38. tree := web.PrintTree()
    39. methods := tree["Data"].(web.M)
    40. for k, v := range methods {
    41. fmt.Printf("%s => %v\n", k, v)
    42. }
    43. //自定义模板函数
    44. web.AddFuncMap("bookName", bookName)
    45. web.Run()
    46. }
    47. // 自定义模板函数添加书名号
    48. func bookName(in string) (out string) {
    49. out = "《" + in + "》"
    50. return
    51. }

     运行效果

    浏览器请求:http://localhost:9090/pathparam/xiaohong

    1.2、表单请求

    修改 controller 目录下 param.go 为下面代码

    1. package controller
    2. import (
    3. "github.com/beego/beego/v2/server/web"
    4. "strconv"
    5. )
    6. type ParamController struct {
    7. web.Controller
    8. }
    9. func (p *ParamController) PathParam() {
    10. name := p.Ctx.Input.Param(":name")
    11. p.Ctx.WriteString(name)
    12. }
    13. func (p *ParamController) GetParam() {
    14. name := p.GetString("name")
    15. age, _ := p.GetInt("age")
    16. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    17. }

    修改 login.html 为下面代码

    1. <div>
    2. <h2>登录h2>
    3. <form action="/getparam" method="get">
    4. <input type="text" name="name" />
    5. <input type="text" name="age" />
    6. <input type="submit" value="提交">
    7. form>
    8. div>

    浏览器请求:http://localhost:9090/page/main

    运行效果

    这种方式除了可以使用表单提交外,还可以直接在浏览器上拼接请求地址访问

    直接请求:http://localhost:9090/getparam?name=bobbb&age=18

    运行效果

    通过 GetString 或 GetInt 等方法获取参数,更多API 可以看官网文档

    1.3、传入默认值

    在发送请求时没有携带参数,给一个默认的值,看下面方法

    1. func (p *ParamController) GetParam() {
    2. name := p.GetString("name", "默认名称 Jack")
    3. age, _ := p.GetInt("age", 18)
    4. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    5. }

    运行效果

    1.4、post 请求

    修改 controller 目录下 param.go 为下面代码

    1. package controller
    2. import (
    3. "github.com/beego/beego/v2/server/web"
    4. "strconv"
    5. )
    6. type ParamController struct {
    7. web.Controller
    8. }
    9. func (p *ParamController) PathParam() {
    10. name := p.Ctx.Input.Param(":name")
    11. p.Ctx.WriteString(name)
    12. }
    13. func (p *ParamController) GetParam() {
    14. name := p.GetString("name")
    15. age, _ := p.GetInt("age")
    16. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    17. }
    18. // PostParam post 请求
    19. func (p *ParamController) PostParam() {
    20. name := p.GetString("name")
    21. age, _ := p.GetInt("age")
    22. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    23. }

    修改 main.go 为下面代码,添加PostParam 的路由

    1. package main
    2. import (
    3. "beego-demo/controller"
    4. "beego-demo/filter"
    5. "fmt"
    6. "github.com/beego/beego/v2/core/config"
    7. "github.com/beego/beego/v2/server/web"
    8. )
    9. func main() {
    10. //通过config获取自定义配置
    11. workername, _ := config.String("workername")
    12. fmt.Println(workername)
    13. //执行定时任务
    14. //go job.DemoTask()
    15. //注册自动路由
    16. //web.AutoPrefix("api", &controller.UserController{})
    17. web.CtrlGet("/name", (*controller.UserController).Name)
    18. web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
    19. web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
    20. //返回页面
    21. web.CtrlGet("/page/index", (*controller.PageController).Index)
    22. web.CtrlGet("/page/f", (*controller.PageController).F)
    23. web.CtrlGet("/page/main", (*controller.PageController).Main)
    24. //web输入参数
    25. web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
    26. web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
    27. web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
    28. //注册函数式路由
    29. controller.RegisterFunctionalRoutes()
    30. //web命名空间
    31. controller.RegisterNamespaceRoutes()
    32. //过滤器
    33. filter.RegisterFilters()
    34. //开启 Admin 管理后台
    35. web.BConfig.Listen.EnableAdmin = true
    36. web.BConfig.Listen.AdminAddr = "localhost"
    37. web.BConfig.Listen.AdminPort = 8088
    38. //web.BConfig.WebConfig.ViewsPath = "pages"
    39. //查看已注册路由
    40. tree := web.PrintTree()
    41. methods := tree["Data"].(web.M)
    42. for k, v := range methods {
    43. fmt.Printf("%s => %v\n", k, v)
    44. }
    45. //自定义模板函数
    46. web.AddFuncMap("bookName", bookName)
    47. web.Run()
    48. }
    49. // 自定义模板函数添加书名号
    50. func bookName(in string) (out string) {
    51. out = "《" + in + "》"
    52. return
    53. }

    修改 login.html 为下面代码

    1. <div>
    2. <h2>登录h2>
    3. <form action="/getparam" method="get">
    4. <input type="text" name="name" />
    5. <input type="text" name="age" />
    6. <input type="submit" value="提交">
    7. form>
    8. <h2>post 请求h2>
    9. <form action="/postparam" method="post">
    10. <input type="text" name="name" />
    11. <input type="text" name="age" />
    12. <input type="submit" value="提交">
    13. form>
    14. div>

    运行效果

    2、Bind 类方法

    大多数时候,我们还需要把输入转换为结构体,Beego 提供了一系列的方法来完成输入到结构体的绑定

    使用 bind 绑定结构体需要先开启绑定,设置 web.BConfig.CopyRequestBody = true

    web.BConfig.CopyRequestBody = true

    修改 controller 目录下 param.go 为下面代码

    1. package controller
    2. import (
    3. "fmt"
    4. "github.com/beego/beego/v2/server/web"
    5. "strconv"
    6. )
    7. type ParamController struct {
    8. web.Controller
    9. }
    10. func (p *ParamController) PathParam() {
    11. name := p.Ctx.Input.Param(":name")
    12. p.Ctx.WriteString(name)
    13. }
    14. func (p *ParamController) GetParam() {
    15. name := p.GetString("name")
    16. age, _ := p.GetInt("age")
    17. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    18. }
    19. // PostParam post 请求
    20. func (p *ParamController) PostParam() {
    21. name := p.GetString("name")
    22. age, _ := p.GetInt("age")
    23. p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
    24. }
    25. type LoginParam struct {
    26. Username string `json:"username"`
    27. Password string `json:"password"`
    28. }
    29. // BindParam bind 类方法
    30. func (p *ParamController) BindParam() {
    31. loginParam := LoginParam{}
    32. p.BindJSON(&loginParam)
    33. fmt.Println(loginParam)
    34. p.Ctx.WriteString(fmt.Sprintf("%v", loginParam))
    35. }

    修改 main.go 为下面代码,添加 BindParam的路由和开启 bind 绑定设置

    1. package main
    2. import (
    3. "beego-demo/controller"
    4. "beego-demo/filter"
    5. "fmt"
    6. "github.com/beego/beego/v2/core/config"
    7. "github.com/beego/beego/v2/server/web"
    8. )
    9. func main() {
    10. //通过config获取自定义配置
    11. workername, _ := config.String("workername")
    12. fmt.Println(workername)
    13. //执行定时任务
    14. //go job.DemoTask()
    15. //注册自动路由
    16. //web.AutoPrefix("api", &controller.UserController{})
    17. web.CtrlGet("/name", (*controller.UserController).Name)
    18. web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
    19. web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
    20. //返回页面
    21. web.CtrlGet("/page/index", (*controller.PageController).Index)
    22. web.CtrlGet("/page/f", (*controller.PageController).F)
    23. web.CtrlGet("/page/main", (*controller.PageController).Main)
    24. //web输入参数
    25. web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
    26. web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
    27. web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
    28. web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)
    29. //注册函数式路由
    30. controller.RegisterFunctionalRoutes()
    31. //web命名空间
    32. controller.RegisterNamespaceRoutes()
    33. //过滤器
    34. filter.RegisterFilters()
    35. //开启 Admin 管理后台
    36. web.BConfig.Listen.EnableAdmin = true
    37. web.BConfig.Listen.AdminAddr = "localhost"
    38. web.BConfig.Listen.AdminPort = 8088
    39. //web.BConfig.WebConfig.ViewsPath = "pages"
    40. //开启post 请求 bind绑定请求体
    41. web.BConfig.CopyRequestBody = true
    42. //查看已注册路由
    43. tree := web.PrintTree()
    44. methods := tree["Data"].(web.M)
    45. for k, v := range methods {
    46. fmt.Printf("%s => %v\n", k, v)
    47. }
    48. //自定义模板函数
    49. web.AddFuncMap("bookName", bookName)
    50. web.Run()
    51. }
    52. // 自定义模板函数添加书名号
    53. func bookName(in string) (out string) {
    54. out = "《" + in + "》"
    55. return
    56. }

    修改 login.html 为下面代码

    1. <div>
    2. <h2>登录h2>
    3. <form action="/getparam" method="get">
    4. <input type="text" name="name" />
    5. <input type="text" name="age" />
    6. <input type="submit" value="提交">
    7. form>
    8. <h2>post 请求h2>
    9. <form action="/postparam" method="post">
    10. <input type="text" name="name" />
    11. <input type="text" name="age" />
    12. <input type="submit" value="提交">
    13. form>
    14. <br>
    15. <button onclick="send()">发送button>
    16. div>
    17. <script src="https://unpkg.com/jquery@3.7.1/dist/jquery.js">script>
    18. <script>
    19. function send() {
    20. $.ajax({
    21. url: '/bindparam',
    22. type: 'post',
    23. contentType: 'application/json',
    24. data: JSON.stringify({'username':'admin','password':'123456'}),
    25. success:function (res){
    26. alert(res)
    27. }
    28. })
    29. }
    30. script>

    运行效果

    浏览器请求:http://localhost:9090/page/main

    下一讲:《Beego 使用教程 7:Web 文件上传下载和错误处理》

    至此完

  • 相关阅读:
    百度边止血边扩张
    二叉搜索树在线OJ题讲解
    连续时间系统的时域分析
    都有哪些大厂有自己的Web组件库?
    竞赛 深度学习乳腺癌分类
    手机投屏到笔记本电脑小方法
    TVP 专家谈腾讯云 Cloud Studio:开启云端开发新篇章
    09-07 周三 周志华-机器学习的下载和阅读总结
    wordpress子比主题文章翻译api接口
    gpt-4-vision-preview 识图
  • 原文地址:https://blog.csdn.net/wsjzzcbq/article/details/138222981