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

2024-05-15 20:28

本文主要是介绍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,内容是下面代码

package controllerimport ("github.com/beego/beego/v2/server/web"
)type ParamController struct {web.Controller
}func (p *ParamController) PathParam() {name := p.Ctx.Input.Param(":name")p.Ctx.WriteString(name)
}

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

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web"
)func main() {//通过config获取自定义配置workername, _ := config.String("workername")fmt.Println(workername)//执行定时任务//go job.DemoTask()//注册自动路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回页面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web输入参数web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)//注册函数式路由controller.RegisterFunctionalRoutes()//web命名空间controller.RegisterNamespaceRoutes()//过滤器filter.RegisterFilters()//开启 Admin 管理后台web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//查看已注册路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定义模板函数web.AddFuncMap("bookName", bookName)web.Run()
}// 自定义模板函数添加书名号
func bookName(in string) (out string) {out = "《" + in + "》"return
}

 运行效果

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

1.2、表单请求

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

package controllerimport ("github.com/beego/beego/v2/server/web""strconv"
)type ParamController struct {web.Controller
}func (p *ParamController) PathParam() {name := p.Ctx.Input.Param(":name")p.Ctx.WriteString(name)
}func (p *ParamController) GetParam() {name := p.GetString("name")age, _ := p.GetInt("age")p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
}

修改 login.html 为下面代码

<div><h2>登录</h2><form action="/getparam" method="get"><input type="text" name="name" /><input type="text" name="age" /><input type="submit" value="提交"></form>
</div>

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

运行效果

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

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

运行效果

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

1.3、传入默认值

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

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

运行效果

1.4、post 请求

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

package controllerimport ("github.com/beego/beego/v2/server/web""strconv"
)type ParamController struct {web.Controller
}func (p *ParamController) PathParam() {name := p.Ctx.Input.Param(":name")p.Ctx.WriteString(name)
}func (p *ParamController) GetParam() {name := p.GetString("name")age, _ := p.GetInt("age")p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
}// PostParam post 请求
func (p *ParamController) PostParam() {name := p.GetString("name")age, _ := p.GetInt("age")p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
}

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

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web"
)func main() {//通过config获取自定义配置workername, _ := config.String("workername")fmt.Println(workername)//执行定时任务//go job.DemoTask()//注册自动路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回页面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web输入参数web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)//注册函数式路由controller.RegisterFunctionalRoutes()//web命名空间controller.RegisterNamespaceRoutes()//过滤器filter.RegisterFilters()//开启 Admin 管理后台web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//查看已注册路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定义模板函数web.AddFuncMap("bookName", bookName)web.Run()
}// 自定义模板函数添加书名号
func bookName(in string) (out string) {out = "《" + in + "》"return
}

修改 login.html 为下面代码

<div><h2>登录</h2><form action="/getparam" method="get"><input type="text" name="name" /><input type="text" name="age" /><input type="submit" value="提交"></form><h2>post 请求</h2><form action="/postparam" method="post"><input type="text" name="name" /><input type="text" name="age" /><input type="submit" value="提交"></form>
</div>

运行效果

2、Bind 类方法

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

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

web.BConfig.CopyRequestBody = true

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

package controllerimport ("fmt""github.com/beego/beego/v2/server/web""strconv"
)type ParamController struct {web.Controller
}func (p *ParamController) PathParam() {name := p.Ctx.Input.Param(":name")p.Ctx.WriteString(name)
}func (p *ParamController) GetParam() {name := p.GetString("name")age, _ := p.GetInt("age")p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
}// PostParam post 请求
func (p *ParamController) PostParam() {name := p.GetString("name")age, _ := p.GetInt("age")p.Ctx.WriteString("名称: " + name + "年龄: " + strconv.Itoa(age))
}type LoginParam struct {Username string `json:"username"`Password string `json:"password"`
}// BindParam bind 类方法
func (p *ParamController) BindParam() {loginParam := LoginParam{}p.BindJSON(&loginParam)fmt.Println(loginParam)p.Ctx.WriteString(fmt.Sprintf("%v", loginParam))
}

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

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web"
)func main() {//通过config获取自定义配置workername, _ := config.String("workername")fmt.Println(workername)//执行定时任务//go job.DemoTask()//注册自动路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回页面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web输入参数web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)//注册函数式路由controller.RegisterFunctionalRoutes()//web命名空间controller.RegisterNamespaceRoutes()//过滤器filter.RegisterFilters()//开启 Admin 管理后台web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//开启post 请求 bind绑定请求体web.BConfig.CopyRequestBody = true//查看已注册路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定义模板函数web.AddFuncMap("bookName", bookName)web.Run()
}// 自定义模板函数添加书名号
func bookName(in string) (out string) {out = "《" + in + "》"return
}

修改 login.html 为下面代码

<div><h2>登录</h2><form action="/getparam" method="get"><input type="text" name="name" /><input type="text" name="age" /><input type="submit" value="提交"></form><h2>post 请求</h2><form action="/postparam" method="post"><input type="text" name="name" /><input type="text" name="age" /><input type="submit" value="提交"></form><br><button onclick="send()">发送</button>
</div>
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.js"></script>
<script>function send() {$.ajax({url: '/bindparam',type: 'post',contentType: 'application/json',data: JSON.stringify({'username':'admin','password':'123456'}),success:function (res){alert(res)}})}
</script>

运行效果

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

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

至此完

这篇关于Beego 使用教程 6:Web 输入处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992839

相关文章

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语