当前位置: 首页 > news >正文

自己给别人做网站挣钱吗/百度收录网站要多久

自己给别人做网站挣钱吗,百度收录网站要多久,自己做网站必须要学哪些,ssp媒体服怎样做网站在 Web 应用开发中,表单是用户与服务器交互的重要手段。Gin 框架对表单处理提供了高效便捷的支持,包括数据绑定、验证等功能。在本篇博客中,我们将详细介绍如何使用 Gin 框架处理表单数据,涵盖基础操作与进阶技巧,帮助…

在 Web 应用开发中,表单是用户与服务器交互的重要手段。Gin 框架对表单处理提供了高效便捷的支持,包括数据绑定、验证等功能。在本篇博客中,我们将详细介绍如何使用 Gin 框架处理表单数据,涵盖基础操作与进阶技巧,帮助初学者全面掌握表单功能。


文章目录

    • 1. 表单处理的基础知识
    • 2. 基本表单处理示例
      • 2.1 配置路由和表单页面
        • 表单页面(HTML 文件)
        • 服务器端代码
      • 2.2 测试表单功能
    • 3. 数据绑定
      • 3.1 基本数据绑定
        • 定义结构体
        • 修改表单处理逻辑
      • 3.2 数据验证
        • 示例代码
        • 验证逻辑
      • 3.3 自定义验证规则
    • 4. 文件上传
      • 4.1 单文件上传
        • 表单页面
        • 服务器端代码
      • 4.2 多文件上传
        • 表单页面
        • 路由逻辑
    • 5. 表单处理的完整项目示例
      • 项目结构
      • 完整代码
    • 6. 总结


在这里插入图片描述

1. 表单处理的基础知识

表单处理包括从客户端获取用户提交的数据,将数据绑定到结构体,验证其有效性,并根据结果执行相关操作。主要流程如下:

  1. 用户提交表单:通过 HTTP 方法(通常是 POST)。
  2. 解析数据:服务器端从请求中提取数据。
  3. 数据绑定:将数据映射到预定义的结构体中。
  4. 数据验证:确保提交的数据符合业务逻辑需求。

2. 基本表单处理示例

2.1 配置路由和表单页面

表单页面(HTML 文件)

templates/form.html 中创建一个简单的表单:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户注册</title>
</head>
<body><h1>用户注册</h1><form action="/register" method="POST"><label for="username">用户名:</label><input type="text" id="username" name="username"><br><label for="email">邮箱:</label><input type="email" id="email" name="email"><br><label for="password">密码:</label><input type="password" id="password" name="password"><br><button type="submit">注册</button></form>
</body>
</html>
服务器端代码

通过 Gin 路由加载表单页面,并设置数据接收路由:

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 加载模板r.LoadHTMLGlob("templates/*")// 表单页面r.GET("/form", func(c *gin.Context) {c.HTML(200, "form.html", nil)})// 处理表单提交r.POST("/register", func(c *gin.Context) {username := c.PostForm("username")email := c.PostForm("email")password := c.PostForm("password")c.JSON(200, gin.H{"username": username,"email":    email,"password": password,})})r.Run(":8080")
}

2.2 测试表单功能

运行程序后访问 http://localhost:8080/form,填写表单并提交。服务器将返回 JSON 格式的数据:

{"username": "张三","email": "zhangsan@example.com","password": "123456"
}

3. 数据绑定

数据绑定是将请求中的表单数据映射到 Go 的结构体中,简化了字段提取与验证的流程。

3.1 基本数据绑定

定义结构体

定义一个用于接收表单数据的结构体:

type RegistrationForm struct {Username string `form:"username"`Email    string `form:"email"`Password string `form:"password"`
}
修改表单处理逻辑

使用 c.ShouldBind 方法将表单数据绑定到结构体:

r.POST("/register", func(c *gin.Context) {var form RegistrationFormif err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.JSON(200, gin.H{"username": form.Username,"email":    form.Email,"password": form.Password,})
})

3.2 数据验证

在结构体字段上添加 binding 标签进行验证。Gin 使用 go-playground/validator 库提供强大的验证功能。

示例代码
type RegistrationForm struct {Username string `form:"username" binding:"required,min=3,max=20"`Email    string `form:"email" binding:"required,email"`Password string `form:"password" binding:"required,min=6"`
}
验证逻辑

当提交的数据不符合要求时,c.ShouldBind 将返回错误信息:

if err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return
}

3.3 自定义验证规则

Gin 允许注册自定义验证器。例如,验证用户名是否只包含字母:

package mainimport ("github.com/gin-gonic/gin""github.com/go-playground/validator/v10""regexp"
)var validate *validator.Validatefunc usernameValidator(fl validator.FieldLevel) bool {return regexp.MustCompile(`^[a-zA-Z]+$`).MatchString(fl.Field().String())
}func main() {r := gin.Default()// 注册自定义验证器validate = validator.New()validate.RegisterValidation("isalpha", usernameValidator)// 路由r.POST("/register", func(c *gin.Context) {var form struct {Username string `form:"username" binding:"required,isalpha"`}if err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.JSON(200, gin.H{"username": form.Username})})r.Run(":8080")
}

4. 文件上传

Gin 提供对文件上传的原生支持,可以处理单文件和多文件上传。

4.1 单文件上传

表单页面
<form action="/upload" method="POST" enctype="multipart/form-data"><label for="file">选择文件:</label><input type="file" id="file" name="file"><button type="submit">上传</button>
</form>
服务器端代码
r.POST("/upload", func(c *gin.Context) {file, _ := c.FormFile("file")c.SaveUploadedFile(file, "./uploads/"+file.Filename)c.JSON(200, gin.H{"message": "文件上传成功", "filename": file.Filename})
})

4.2 多文件上传

修改表单页面和路由逻辑:

表单页面
<form action="/upload-multiple" method="POST" enctype="multipart/form-data"><label for="files">选择文件:</label><input type="file" id="files" name="files" multiple><button type="submit">上传</button>
</form>
路由逻辑
r.POST("/upload-multiple", func(c *gin.Context) {form, _ := c.MultipartForm()files := form.File["files"]for _, file := range files {c.SaveUploadedFile(file, "./uploads/"+file.Filename)}c.JSON(200, gin.H{"message": "所有文件上传成功"})
})

5. 表单处理的完整项目示例

结合表单验证、文件上传、数据绑定,构建一个完整的用户注册项目。

项目结构

├── main.go
├── templates
│   ├── form.html
│   └── success.html
├── uploads

完整代码

package mainimport ("github.com/gin-gonic/gin"
)type User struct {Username string `form:"username" binding:"required,min=3,max=20"`Email    string `form:"email" binding:"required,email"`Password string `form:"password" binding:"required,min=6"`
}func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")r.Static("/uploads", "./uploads")r.GET("/form", func(c *gin.Context) {c.HTML(200, "form.html", nil)})r.POST("/register", func(c *gin.Context) {var user Userif err := c.ShouldBind(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.HTML(200, "success.html", gin.H{"user": user})})r.Run(":8080")
}

6. 总结

本篇博客详细介绍了 Gin 框架中表单处理与数据绑定的功能,从基础的表单提交到复杂的数据验证和文件上传,再到完整项目示例,涵盖了实际开发中的常见场景。在下一篇博客中,我们将学习如何处理 API 请求与 JSON 数据绑定,进一步拓展你的 Web 开发能力。
在这里插入图片描述

相关文章:

【Golang】——Gin 框架中的表单处理与数据绑定

在 Web 应用开发中&#xff0c;表单是用户与服务器交互的重要手段。Gin 框架对表单处理提供了高效便捷的支持&#xff0c;包括数据绑定、验证等功能。在本篇博客中&#xff0c;我们将详细介绍如何使用 Gin 框架处理表单数据&#xff0c;涵盖基础操作与进阶技巧&#xff0c;帮助…...

hive-内部表外部表-详细介绍

1、表类型介绍 内部表&#xff1a; 表面来看&#xff0c;我们建的所有的表&#xff0c;默认都是内部表&#xff0c;内部表又叫做管理表&#xff0c;它的位置也很固定/user/hive/warehouse下面。 外部表&#xff1a; 创建的时候需要加关键字external 修饰&#xff0c;而且&a…...

Windows系统 ElasticSearch,分词器、Kibana安装

目录 1.wins安装ElasticSearch1.下载es安装包2.下载分词器3.注意事项4.学会看报错日志 2.将 elasticsearch 以服务的方式安装安装ES解压到根盘符下&#xff0c;如C或E盘等&#xff0c;因为 E:\Program Files文件夹下的都是默认的只读权限&#xff0c;所以换到没有只读权限&…...

黑马智数Day10

项目背景说明 后台管理部分使用的技术栈是Vue2&#xff0c;前台可视化部分使用的技术栈是Vue3 前台可视化项目不是独立存在&#xff0c;而是和后台管理项目共享同一个登录页面 微前端的好处 微前端是一种前端架构模式&#xff0c;它将大型单体应用程序分解为小的、松散耦合的…...

网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机

目录 网卡IP网络地址主机地址子网子网掩码网关默认网关 MACARPARP抓包分析 路由器NATNAPT 交换机 网卡 网卡(Network Interface Card&#xff0c;简称NIC)&#xff0c;也称网络适配器。 OSI模型&#xff1a; 1、网卡工作在OSI模型的最后两层&#xff0c;物理层和数据链路层。物…...

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

文章目录 MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的&#xff1f;——阅读总结一、MySQL 主备基本原理&#xff08;一&#xff09;主备切换流程&#xff08;二&#xff09;主备数据同步流程 二、binlog 格式及相关问题&#xff08;一&#xff09;binlog 的三种格式&#…...

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介 登录模块很简单&#xff0c;前端发送账号密码的表单&#xff0c;后端接收验证后即可~ 淦&#xff01;可是我想多了&#xff0c;于是有了以下几个问题&#xff08;里面还包含网络安全问题&#xff09;&#xff1a; 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…...

golang调用模组程序实现交互输入自动化,获取imei及iccid

应用场景&#xff1a;在openwrt下调用移远的测试程序&#xff0c;并实现输入自动话&#xff0c;获取imei rootOpenWrt:~# ql-api-test Test groups:0: ql_dsi1: ql_nw2: ql_sim3: ql_dev4: ql_voice5: ql_sms6: ql_adc7: ql_i2c8: …...

ACE之单例

单例簇 使用双重锁检查优化 #mermaid-svg-RMOXQ0KMo0VnJe7V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-icon{fill:#552222;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-text{fill:#552222…...

泷羽sec学习打卡-云技术基础1-docker

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于云技术基础的那些事儿-Base1 一、云技术基础什么是云架构&#xff1f;什么是云服务&#xff1f;什么…...

7天掌握SQL - 第一天:数据库基础与SQL入门

目标 在本章节中&#xff0c;我们将学习数据库的基本概念和SQL语言的基础操作&#xff0c;为后续的深入学习打下坚实的基础。 一级目录 数据库基本概念SQL语言基础SQL操作实践推荐资源总结 1. 数据库基本概念 1.1 表&#xff08;Table&#xff09; 表是数据库中存储数据的…...

A037-基于Spring Boot的二手物品交易的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

【异常记录】Junitmock之InvalidUseOfMatchersException异常

mock之InvalidUseOfMatchersException异常 新手小白对mock一知半解&#xff0c;就开始自测了&#xff0c;被这个InvalidUseOfMatchersException困扰了一晚上。排查了好久&#xff0c;大多数文章都把英文翻译了一遍&#xff0c;但自检无问题。最后发现是&#xff0c;注入的时候…...

Spring Boot3自定义starter

1、加入必要依赖 plugins {id javaid org.springframework.boot version 3.2.6id io.spring.dependency-management version 1.1.5 } group org.example.test.starter version 1.1.0jar{enabledtrue// resolveMainClassName }java {toolchain {languageVersion JavaLanguage…...

掌控 Solidity:事件日志、继承和接口的深度解析

Solidity 是以太坊智能合约的主要编程语言&#xff0c;它的强大之处在于能够帮助开发者构建安全、高效的去中心化应用。在我参与的多个项目中&#xff0c;事件日志、继承和接口这三个概念始终贯穿其中&#xff0c;成为构建复杂智能合约的关键技术。今天就来聊聊Solidity中的错误…...

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…...

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…...

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制&#xff08;一台电脑作测试无法…...

第6章详细设计-6.9 PCB审查

6.9 PCB审查 6.9.1 布局阶段注意事项1.结构设计要求在PCB布局之前弄清楚产品的结构2.布局要求 6.9.2 布线注意事项6.9.3 接地处理&#xff08;1&#xff09;射频链路接地。&#xff08;2&#xff09;腔壳接地孔。&#xff08;3&#xff09;螺钉放置&#xff08;需要了解结构知识…...

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm3&#xff09;exec /cp4&#xff09;run/create…...

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…...

云原生周刊:Kubernetes v1.32 要来了

开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎&#xff0c;以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言&#xff0c;能够灵活适配不同开发流程&#xff0c;帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…...

# JVM学习

JVM JVM是什么&#xff1f; Java虚拟机&#xff08;JVM&#xff09; 是一个抽象的计算机&#xff0c;它是一个运行时环境&#xff0c;用于执行Java字节码或编译后的Java程序。JVM屏蔽了底层操作系统的差异&#xff0c;使得Java程序可以在任何支持JVM的操作系统上运行。 JVM能…...

【代码随想录day33】【C++复健】62.不同路径;63. 不同路径 II;343. 整数拆分;96.不同的二叉搜索树

感觉dp的题真的很适合背&#xff0c;当然不是死记硬背&#xff0c;而是当做一种模板题&#xff0c;出来一道新的题就往模板题上面去靠&#xff0c;如果套对模板的话剩下的事情其实就简单了。所以只要看一遍解法知道大致思路其实就够了&#xff0c;毕竟大部分dp的代码也不算难写…...

《勇者斗恶龙3:HD-2D重制版》找幽灵船攻略分享

《勇者斗恶龙3&#xff1a;HD-2D重制版》中的幽灵船是游戏里非常独特的一个区域&#xff0c;而想要找到幽灵船的话还是比较麻烦的&#xff0c;首先是听到关于幽灵船在世界海域上航行的传闻&#xff0c;包括在海盗巢穴中&#xff0c;但幽灵船的出现有一些具体条件。 勇者斗恶龙3…...

基于 MATLAB 的模拟退火算法详解及实现

以下是一篇更详细的关于 模拟退火算法 (Simulated Annealing) 的 MATLAB 实现的教程和代码示例&#xff0c;涵盖基本概念、核心思想和代码实现。 一、模拟退火算法简介 模拟退火算法&#xff08;Simulated Annealing&#xff0c;简称 SA&#xff09;是一种随机优化算法&#x…...

MQTT 服务器常用的有哪些?

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;常用于物联网&#xff08;IoT&#xff09;设备之间的通信。以下是一些常用的 MQTT 服务器&#xff08;也称为 MQTT Broker&#xff09;&#xff1a; 1.Eclipse Mosqui…...

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件&#xff1a;USBToSerialPort.apk 链接&#xff1a;https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码&#xff1a;8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…...

汽车资讯新探索:Spring Boot技术引领

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…...