go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定

目录

第一节-?gin参数绑定

ShouldBind简要概述

功能:

使用场景:

可能的错误:

实例代码

效果展示

第二节-gin文件上传

选择要上传的文件

选择要上传的文件。

效果展示?

代码部分

第三节-gin请求重定向

第四节-gin路由和路由组

Any用法

NoRoute

路由组


ShouldBindgin框架中的一个方法,用于将请求中的数据绑定到指定的结构体上。

ShouldBind简要概述

  • 功能
    • 它会根据请求的Content-Type自动解析请求中的数据,并将其绑定到传入的结构体指针所指向的结构体中。
    • 对于GET请求,它会尝试从查询参数中解析数据;对于POST请求,它会根据Content-Type进行不同的解析,例如application/x-www-form-urlencodedapplication/json等。
  • 使用场景
    • 当你需要从客户端请求中提取数据并存储到结构体中时,使用ShouldBind可以方便地将请求中的数据映射到结构体的字段上。
    • 它会自动处理数据类型的转换,将请求中的字符串数据转换为结构体字段对应的类型。
  • 可能的错误
    • 如果请求中的数据无法正确解析或转换为结构体字段的类型,ShouldBind会返回错误。
    • 例如,如果请求中某个字段的值无法转换为结构体中相应字段的类型(如将字符串 “abc” 转换为int类型),会导致绑定失败并返回错误。

实例代码

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)// 定义结构体
type UserInfo struct {UserName string `form:"username"`Password string `form:"password"`
}func main() {r := gin.Default()r.GET("/user", func(c *gin.Context) {var u UserInfoerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})} else {fmt.Printf("u:%#v
", u)c.JSON(http.StatusOK, gin.H{"username": u.UserName,"password": u.Password,})}})r.Run(":1205")
}

效果展示

第二节-gin文件上传

选择要上传的文件

// 处理 POST 请求到 /upload 路径r.POST("/upload", func(c *gin.Context) {// 从请求中获取名为 f1 的文件f, err := c.FormFile("f1")if err != nil {// 记录错误信息log.Printf("Error retrieving file: %v", err)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to retrieve file",})return}// 验证文件大小,假设限制文件大小为 5MBif f.Size > 1024*1024*5 {// 记录文件大小超出限制的错误信息log.Printf("File size too large: %v", f.Size)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "File size exceeds limit",})return}// 验证文件类型,假设只允许 JPEG 和 PNGif f.Header.Get("Content-Type") != "image/jpeg" && f.Header.Get("Content-Type") != "image/png" {// 记录文件类型错误信息log.Printf("Invalid file type: %v", f.Header.Get("Content-Type"))// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid file type",})return}// 构建保存文件的目标路径dst := path.Join("./", f.Filename)// 保存上传的文件if err := c.SaveUploadedFile(f, dst); err != nil {// 记录保存文件时的错误信息log.Printf("Error saving file: %v", err)// 返回错误响应c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save file",})return}// 返回成功响应c.JSON(http.StatusOK, gin.H{"status": "ok",})})

对上传的文件进行相对应的操作。

选择要上传的文件。

效果展示

代码部分

因为前端部分较为简单,在这里就不再进行展示了。

package mainimport ("log""net/http""path""github.com/gin-gonic/gin"
)func main() {// 创建一个默认的 gin 路由r := gin.Default()// 加载 index.html 文件r.LoadHTMLFiles("./index.html")// 处理 GET 请求到 /index 路径r.GET("/index", func(c *gin.Context) {// 渲染 index.html 文件c.HTML(http.StatusOK, "index.html", nil)})// 处理 POST 请求到 /upload 路径r.POST("/upload", func(c *gin.Context) {// 从请求中获取名为 f1 的文件f, err := c.FormFile("f1")if err != nil {// 记录错误信息log.Printf("Error retrieving file: %v", err)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Failed to retrieve file",})return}// 验证文件大小,假设限制文件大小为 5MBif f.Size > 1024*1024*5 {// 记录文件大小超出限制的错误信息log.Printf("File size too large: %v", f.Size)// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "File size exceeds limit",})return}// 验证文件类型,假设只允许 JPEG 和 PNGif f.Header.Get("Content-Type") != "image/jpeg" && f.Header.Get("Content-Type") != "image/png" {// 记录文件类型错误信息log.Printf("Invalid file type: %v", f.Header.Get("Content-Type"))// 返回错误响应c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid file type",})return}// 构建保存文件的目标路径dst := path.Join("./", f.Filename)// 保存上传的文件if err := c.SaveUploadedFile(f, dst); err != nil {// 记录保存文件时的错误信息log.Printf("Error saving file: %v", err)// 返回错误响应c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save file",})return}// 返回成功响应c.JSON(http.StatusOK, gin.H{"status": "ok",})})// 启动服务器,监听 1205 端口r.Run(":1205")
}

第三节-gin请求重定向

注意此处请求的是ddd

回车之后

ddd变成了a

仔细观察后端部分的代码,不难看出,访问ddd的时候,跳转到了a,访问a的时候跳转到了b,所以会打印出b中存放的信息。也就是上述效果中展示的样子。

第四节-gin路由和路由组

Any用法

Any可以匹配任何形式的请求,这里因为没有postman所以没有对其他形式的请求进行测试,大家可以自行使用postman进行测试。

NoRoute

当没有对应的请求的时候,会进入到这一函数,如果没有进行定义就会出现404错误的页面。这里也只是对404页面进行了一下自定义操作。

路由组

路由组

路由组可以嵌套路由组

路由组可以添加中间件

路由组可以添加路由

路由组可以添加静态文件

路由组可以添加模板

路由组可以添加重定向

路由组可以添加错误处理

路由组可以添加自定义渲染器

仔细观察这三个图片的url不难看出都是voide开头的,因此我们可以将它们分成一个组来进行汇总一下。将他们的公共前缀提取出来,使得代码看起来不那么繁琐。

这样看起来更加条理清晰,用一个{}进行包括。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测!五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好,替换数据集后,仅运…

12.27【net】【review】【day3】

第三章 l CSMA/CD ( Carrier Sense Multiple Access with Collision Detection) : 载波监听多点接入 / 碰撞 检测。 l 多点接入 : 说明这是总线型 网络。许多 计算机以多点接入的方式连接在一根总线上。 l 载波监听: 即“ 边发送边监听”。…

Python学生管理系统(MySQL)

上篇文章介绍的Python学生管理系统GUI有不少同学觉得不错来找博主要源码,也有同学提到老师要增加数据库管理数据的功能,本篇文章就来介绍下python操作数据库,同时也对上次分享的学生管理系统进行了改进了,增加了数据库&#xff0c…

实现类似gpt 打字效果

1. css的动画(animation) css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 具体的可以看MDN链接:https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…

OpenHarmony-5.PM 子系统(2)

电池服务组件OpenHarmony-4.1-Release 1.电池服务组件 Battery Manager 提供了电池信息查询的接口,同时开发者也可以通过公共事件监听电池状态和充放电状态的变化。电池服务组件提供如下功能: 电池信息查询。充放电状态查询。关机充电。 电池服务组件架…

软考:系统架构设计师教材笔记(持续更新中)

教材中的知识点都会在。其实就是将教材中的废话删除,语言精练一下,内容比较多,没有标注重点 系统架构概述 定义 系统是指完成某一特定功能或一组功能所需要的组件集,而系统架构则是对所有组件的高层次结构表示,包括各…

反应力场的生成物、反应路径分析方法

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

HarmonyOS NEXT 实战之元服务:静态案例效果---妙语集语

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …

C#WPF基础介绍/第一个WPF程序

什么是WPF WPF(Windows Presentation Foundation)是微软公司推出的一种用于创建窗口应用程序的界面框架。它是.NET Framework的一部分,提供了一套先进的用户界面设计工具和功能,可以实现丰富的图形、动画和多媒体效果。 WPF 使用…

【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode

文章目录 有效的数独解数独单词搜索黄金矿工不同的路径||| 有效的数独 递归解法思路 将每个数独的格子视为一个任务,依次检查每个格子是否合法。 如果当前格子中的数字违反了数独规则(在行、列或 33 小方块中重复),直接返回 Fals…

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

进军AI大模型-环境配置

语言环境配置 合法上网工具: 这个T子试试,一直稳定。走我链接免费用5天: https://wibnm.com/s/ywtc01/pvijpzy python版本: python3.12 Langchain: Introduction | 🦜️🔗 LangChain v0.3 9月16日升级的版本 pip3…

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串?2、两个引号之间加上空格 好的,我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别,以及它们在 SQL 查询中的作用: 1. we_chat_union_id IS NOT NULL 含…

elementUI——upload限制图片或者文件只能上传一个——公开版

最近在写后台管理系统时,遇到一个需求,就是上传图片,有且仅能上传一张。 效果图如下: 功能描述:上传图片时,仅支持单选,如果上传图片成功后,展示图片,并隐藏添加图片的…

【RabbitMQ高级篇】消息可靠性问题(1)

目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…

MyBatis知识点笔记

目录 mybatis mapper-locations的作用? mybatis configuration log-impl 作用? resultType和resultMap的区别? 参数 useGeneratedKeys ,keyColumn,keyProperty作用和用法 取值方式#和$区别 动态标签有哪些 MyBat…

Vue3 使用OCR识别图片文字

Tesseract.js 是一个javascript库&#xff0c;可以从图像中获取几乎任何语言的单词&#xff0c;支持文本转pdf功能&#xff0c;精准度很高。 1. 安装 npm install tesseract.js 2. 示例代码&#xff08;vue3版&#xff09; <template><div class"container&qu…

【多维DP】力扣3366. 最小数组和

给你一个整数数组 nums 和三个整数 k、op1 和 op2。 你可以对 nums 执行以下操作&#xff1a; 操作 1&#xff1a;选择一个下标 i&#xff0c;将 nums[i] 除以 2&#xff0c;并 向上取整 到最接近的整数。你最多可以执行此操作 op1 次&#xff0c;并且每个下标最多只能执行一…

python+PyMuPDF库:(一)创建pdf文件及内容读取和写入

目录 文档操作 打开文档 获取文档信息 删除页 复制页 移动页 选择重构合并 保存关闭 页对象操作 内容读取 获取页对象的字体样式 插入文本标签 插入文本内容 字体设置 insert_text添加文本 insert_textbox添加文本 插入图片 获取页面注释、链接、表单字段 …

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…