首页 > 其他分享 >go语言的成神之路-筑基篇-第四章

go语言的成神之路-筑基篇-第四章

时间:2024-12-01 19:57:20浏览次数:5  
标签:http 请求 err 筑基 成神 JSON go gin 路由

第一节- gin参数绑定

目录

第一节- gin参数绑定

ShouldBind简要概述

功能:

使用场景:

可能的错误:

实例代码

效果展示

第二节-gin文件上传

选择要上传的文件

选择要上传的文件。

效果展示 

代码部分

第三节-gin请求重定向

第四节-gin路由和路由组

Any用法

NoRoute

路由组


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

ShouldBind简要概述

  • 功能

    • 它会根据请求的 Content-Type 自动解析请求中的数据,并将其绑定到传入的结构体指针所指向的结构体中。
    • 对于 GET 请求,它会尝试从查询参数中解析数据;对于 POST 请求,它会根据 Content-Type 进行不同的解析,例如 application/x-www-form-urlencoded 或 application/json 等。
  • 使用场景

    • 当你需要从客户端请求中提取数据并存储到结构体中时,使用 ShouldBind 可以方便地将请求中的数据映射到结构体的字段上。
    • 它会自动处理数据类型的转换,将请求中的字符串数据转换为结构体字段对应的类型。
  • 可能的错误

    • 如果请求中的数据无法正确解析或转换为结构体字段的类型,ShouldBind 会返回错误。
    • 例如,如果请求中某个字段的值无法转换为结构体中相应字段的类型(如将字符串 "abc" 转换为 int 类型),会导致绑定失败并返回错误。

实例代码

package main

import (
	"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 UserInfo
		err := c.ShouldBind(&u)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		} else {
			fmt.Printf("u:%#v\n", 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
		}
		// 验证文件大小,假设限制文件大小为 5MB
		if 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 和 PNG
		if 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 main

import (
	"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
		}
		// 验证文件大小,假设限制文件大小为 5MB
		if 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 和 PNG
		if 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,请求,err,筑基,成神,JSON,go,gin,路由
From: https://blog.csdn.net/2302_80329073/article/details/144130623

相关文章

  • zblog 获取全部分类列表函数 GetCategoryList 的参数和使用方法介绍
    函数参数$select (数组):获取指定数据。$where (数组):数据获取限制规则。$order (数组):数据获取排序规则。$limit (数组):获取数据数量限制。$option (数组):附加限制选项,可用来获取指定范围内的数据。函数输出输出一个数组,包含分类列表数据。示例代码{foreach......
  • Goland2024.3 发布,有点东西
    好多人夸我嘴甜,你要不要尝尝~  上周,Goland2024年最后的一个大版本正式发布了。 虽然这次的更新并不是很丰富,但是仍然有几个值得我们关注的几个亮点。 第一个,支持循环导入的检查循环导入的出现往往是不经意的,但是如果可以早点发现循环导入,那么也就可以避免对堆积如......
  • Azure Arc 是 Microsoft 提供的一项跨平台的服务,旨在帮助用户将本地环境、边缘设备、
    AzureArc是Microsoft提供的一项跨平台的服务,旨在帮助用户将本地环境、边缘设备、以及其他云平台(如AWS和GoogleCloud)上的资源纳入Azure的管理范围。通过AzureArc,用户可以在Azure中管理分布在不同环境中的服务器、Kubernetes集群、应用程序等资源,而无需将它们迁移到......
  • How can I fix that my variable goes into the formatted string of my html code in
    题意:我该如何修复我的变量正确地插入到Python中HTML代码的格式化字符串中?问题背景:ForaprojectI'mrunningaraspberrypiPicowhbasedwebserverthatshouldgettheinputsofthetemperaturesensoranddisplayitonthewebsite.Iamhowevernotvery......
  • 基于TCN-Transformer-KAN混合模型实现电力负荷时序预测——Kolmogorov-Arnold Network
    前言系列专栏:【深度学习:算法项目实战】✨︎涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆......
  • python毕业设计django美食推荐系统 wc5xj
    文章目录项目介绍具体实现截图开发技术系统性能核心代码部分展示源码/演示视频获取方式项目介绍python毕业设计django美食推荐系统wc5xj具体实现截图开发技术python基于flask框架的框架支持:flask/djangoPython版本:python3.7.7开发软件:PyCharm浏览器:谷......
  • 第七章:并发编程 1.Goroutines --Go 语言轻松入门
    Go语言中的Goroutines是一种轻量级的线程,它允许你以非常低的成本并发执行多个函数或方法。Goroutines是Go并发模型的核心组成部分,与channels一起使用可以实现高效的并发编程。什么是Goroutines?1.内存占用小初始堆栈大小:每个Goroutine的初始堆栈大小非常小,通常......
  • Cloud Mongodb中organization和project和cluster和databases的关系。
    一个集群(cluster)是多个数据库的集合,这多个数据库的集合共同服务于一个项目。本质上就是把需要的数据按照类别划分成不同的部分,然后分别存储在不同的数据库中。集群虽然是多个数据库的集合,但集群本身就是一个数据库,可以理解为一个服务器程序。但在使用时,可以把一个集群中的一个数据......
  • go 编译超时解决
    转载请注明出处:在编译go项目时,遇到依赖下载超时,异常输出如下:CGO_ENABLED=0GOOS=linuxGO111MODULE=ongobuild-a-ldflags'-extldflags"-static"'-o../../bin/gobmp./gobmp.gogo:google.golang.org/protobuf@v1.30.0:unrecognizedimportpath"google.gol......
  • MongoDB Write Concern
    写关注(WriteConcern)描述了向单独的mongod、副本集或分片集群进行写操作时,MongoDB所要求的确认级别。在分片集群中,mongos实例会将写关注传递给分片。 注:对于多文档事务,应在事务级别而非单个操作级别设置写关注。不要为事务中的单个写操作明确设置写关注。如果为多文档事务......