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

news2024/9/23 7:20:29

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 controller

import (
	"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 main

import (
	"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 = true
	web.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 controller

import (
	"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 controller

import (
	"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 main

import (
	"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 = true
	web.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 controller

import (
	"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 main

import (
	"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 = true
	web.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 文件上传下载和错误处理》

至此完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

⭐解读绍兴BSCI验厂攻略⭐

&#x1f308;解读&#x1f50d;绍兴BSCI验厂攻略&#x1f308; &#x1f60a;深入解读&#x1f449;绍兴BSCI验厂攻略&#x1f448;&#xff0c;助力企业&#x1f481;‍♂️顺利通过国际认证&#x1f990; &#x1f497;在全球化日益&#x1f9ed;加速的今天&#xff0c;&…

我的职场加速器-高效工作从可道云teamOS开始

不论是作为管理者&#xff0c;还是普通打工人&#xff0c;在日常工作中&#xff0c;我们都需要一款既能够保障数据安全&#xff0c;又能够提升团队协作效率的平台。 近期&#xff0c;我体验了可道云teamOS&#xff0c;这款企业级云协作平台给我留下了深刻的印象。 一、极简风…

Pytorch代码基础—张量

Pytorch代码—张量 Pytorch张量 张量的属性&#xff1a; data&#xff1a;被包装的Tensorgrad&#xff1a;data的梯度grad_fn:创建Tensor的Function&#xff0c;是自动求导的关键requires_grad&#xff1a;指示是否需要梯度isleaf&#xff1a;指示是否是叶子结点&#xff0…

SpringBoot应用

文章目录 第一章、SpringBoot基础内容一、Spring和SpringBoot1、Spring介绍2、SpringBoot介绍 二、SpringBoot2入门操作1、在线构建2、idea构建 三、浅谈自动装配的原理 第二章、SpringBoot核心功能一、配置文件1、配置文件介绍2、语法规则3、数据类型4、案例使用 二、WEB开发1…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…

【案例教程】土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

查看原文>>>土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测 土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生…

U盘制作PE后容量少了一半,如何恢复默认空间

格式化U盘 以前制作U盘PE后&#xff0c;从原本64G的容量变成了32G&#xff0c;一直也没去关注处理。 恰巧这两天又遇到U盘无法识别&#xff0c;数据无法读取&#xff0c;想着格式化恢复。 很遗憾&#xff0c;发现利用电脑快速格式化依然无法直接拿到空闲的另一半空间。 磁盘管…

[图解]SysML和EA建模住宅安全系统-03

1 00:00:00,490 --> 00:00:01,180 怎么加 2 00:00:01,570 --> 00:00:04,380 我们来看&#xff0c;这是刚才那个图 3 00:00:05,200 --> 00:00:06,390 17.7 4 00:00:07,150 --> 00:00:08,260 我们同样在这里加 5 00:00:08,430 --> 00:00:10,100 同样在这个下面…

超越人工智能:AnyTool,一款基于GPT-4的智能代理,引领API调用新纪元

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索 AnyTool 的创新应用 在人类文明的发展历程中&#xff0c;我们不断探索和创新&#xff0c;利用各种工具增强我们的能力并提高生产效率。…

Python 全栈系列243 S2S flask_celery

说明 按现有的几个架构部件&#xff0c;构建数据流。 S Redis Stream。这个可以作为缓冲队列和简单任务队列&#xff0c;速度非常快&#xff0c;至少是万条/秒的速度。 Q RabbitMQ。这个作为任务队列&#xff0c;消息也主要是元数据。读速比较慢&#xff0c;但有一些特性&a…

百元以内的蓝牙耳机哪个牌子好?2024四大高品质品牌推荐!

通常对于预算有限的消费者来说&#xff0c;如何在百元以内找到一款品质卓越、性能出色的蓝牙耳机&#xff0c;确实是一个值得深思的问题&#xff0c;为了满足广大消费者的需求&#xff0c;我特别筛选了2024年四大高品质蓝牙耳机品牌&#xff0c;它们在价格亲民的同时&#xff0…

ACWing471. 棋盘-DFS剪枝

题目 思路 本思路参考博客AcWing 471. 棋盘 - AcWing 约束方程&#xff1a; 代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

CSRF 攻击实验:更改请求方式绕过验证

前言 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也称为XSRF&#xff0c;是一种安全漏洞&#xff0c;攻击者通过欺骗用户在受信任网站上执行非自愿的操作&#xff0c;以实现未经授权的请求。 CSRF攻击利用了网站对用户提交的请求缺乏充分验证和防范…

力扣【旋转函数】python

如果直接用暴力的话&#xff0c;只能过4个样例好像&#xff0c;超时 因此得用递推公式 F1F0前n-1个数-(n-1)*第n个数 F0sum(nums)-n*第n个数 nlen(nums) ans[]#定义一个存最大值值的列表 ss sum(nums) dm 0 for j in range(n):dm j * nums[j] ans.append(dm) print(dm) n…

基于EBAZ4205矿板的图像处理:05均值滤波算法

基于EBAZ4205矿板的图像处理&#xff1a;05均值滤波算法 项目全部文件已经上传&#xff0c;是免费的 先看效果 可以明显看到图像变糊了&#xff0c;这就是均值滤波的特点&#xff0c;将噪声均摊到每个点上的同时&#xff0c;也会让图像丢失细节。 算法讲解 均值滤波&#x…

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一&#xff1a;选择排序——原理 二&#xff1a;选择排序——分析 三&#xff1a;选择排序——实现 四&#xff1a;选择排序——优化 五&#xff1a;选择排序——效率 一&#xff1a;选择排序——原理 选择排序的原理&#xff1a;通过遍历数组&#xff0c;选出该数组…

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事&#xff1a; Linux之父叫做“Linus Torvalds”&#xff0c;我们简称为雷纳斯。Linux是开源项目&#xff0c;所以在Linux的早期开发中&#xff0c;许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时&#xff0c;雷纳斯每天都会收到许许…

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

如何进行事务处理

1、问题背景 在数据库存储系统中&#xff0c;事务处理是一种保证多个数据库操作作为单个逻辑单元执行的技术。事务处理可以确保数据的一致性、完整性和隔离性。 在使用 Google Cloud Datastore 时&#xff0c;可以使用 datastore.transaction() 函数来进行事务处理。datastor…